2016-12-28 4 views
0

は、ストアドプロシージャに次のコードを実行しようとすると:CASEステートメントが "after case after"をどうして返すのでしょうか?

CASE 
    WHEN recordNotes=null AND sortNumber=null 
     THEN INSERT INTO tempRecordHolder (union_ID,union_Name) VALUES (recordID, recordName); 
    ELSE SET @blank="null"; 
END CASE; 

「recordNotes」、「sortNumber」、「レコードID」、および「のRecordNameは、」ストアドプロシージャに渡された変数です。私の目標は、INSERT文を関数の最初に作成したtempRecordHolderテーブルに実行させることです。しかし何らかの理由で、「ケースの後に予期せぬ事態が発生する」と言います。何か案は?ありがとうございました。

フルコード、コメントを無視してコードをコメントアウトしてください。それは作業されているすべてのものです。 CASEは34-41行目にあります。

CREATE DEFINER=`apf15102`@`%` PROCEDURE `sp_cu_LookUpTbls`(
    IN tbl_Name varchar(50), 
    recordID int, 
    recordName varChar(500), 
    # REMEMBER THERE IS A DATE BETWEEN THESE TWO FIELDS IN THE TABLE STRUCTURES 
    recordNotes longtext, 
    sortNumber int, 
    recordAlreadyExists bit 
) 
BEGIN 

    #-------------------------------# 
    # Begin preliminary table setup # 
    #-------------------------------# 

    # Begin by dropping my temp table 
    DROP TEMPORARY TABLE IF EXISTS tempRecordHolder; 

    # set my session variable equal to my passed in table name 
    SET @tblName = tbl_Name; 

    # create a session variable string that is the create table for the table that was passed in 
    SET @tbl_Create_Command = concat("CREATE TEMPORARY TABLE tempRecordHolder LIKE " , @tblName); 

    # prepare the statement making it one string that can be executed then execute it 
    prepare stmtCreate FROM @tbl_Create_Command; 
    execute stmtCreate; 

    #-----------------------------# 
    # End preliminary table setup # 
    #-----------------------------# 


    # This code right here gives a "Syntax Error: Unexpected WHEN (when)" if it is un-commented 
    /* 
    CASE 
     WHEN recordNotes IS NULL AND sortNumber IS NULL 
      THEN INSERT INTO tempRecordHolder (union_ID,union_Name) VALUES (recordID, recordName); 
     ELSE SET @blank="null"; 
    END CASE; 
    */ 

    IF recordAlreadyExists = FALSE 
     THEN 
      #-----------------------------------------------------------------# 
      # Begin procedure for if the record DOES NOT exist in our records # 
      #-----------------------------------------------------------------# 
      IF sortNumber IS NULL 
       THEN 
        INSERT INTO tempRecordHolder VALUES (recordID, recordName, curdate(), recordNotes); 
      END IF; 
      IF sortNumber IS NOT NUll 
       THEN 
        INSERT INTO tempRecordHolder VALUES (recordID, recordName, curdate(), recordNotes, sortNumber); 
      END IF; 
      #---------------------------------------------------------------# 
      # End procedure for if the record DOES NOT exist in our records # 
      #---------------------------------------------------------------# 
     ELSE 
      #-------------------------------------------------------------# 
      # Begin procedure for if the record DOES exist in our records # 
      #-------------------------------------------------------------# 
      IF recordAlreadyExists = TRUE 
       THEN 
        SET @elsevar = null; 
      END IF; 
      #-----------------------------------------------------------# 
      # END procedure for if the record DOES exist in our records # 
      #-----------------------------------------------------------# 
    END IF; 
    /* 
    #-----------------------------# 
    # Begin data processing setup # 
    #-----------------------------# 

    # Declare all the necessary variables for making a cursor 
    DECLARE finished BOOLEAN DEFAULT FALSE; 
    DECLARE colNameForInsert varChar(50); 
    DECLARE columnName CURSOR FOR 
     (
      SELECT `COLUMN_NAME` 
      FROM `INFORMATION_SCHEMA`.`COLUMNS` 
      WHERE `TABLE_NAME`='tempRecordHolder'; 
     ); 
    DECLARE CONTINUE HANDLER 
     FOR NOT FOUND SET finished = TRUE; 

    #---------------------------# 
    # END data processing setup # 
    #---------------------------# 

    #--------------------------------# 
    # Begin main loop and processing # 
    #--------------------------------# 

    OPEN columnName; 
    manFunc: loop 

     # check to see if we are done before running the rest of the loop 
     IF finished = TRUE THEN 
      LEAVE mainFunc; 
     END IF; 
     FETCH columnName INTO colNameForInsert; 

     IF 

    END LOOP mainFunc; 
    CLOSE columnName; 

    #------------------------------# 
    # END main loop and processing # 
    #------------------------------# 

    */ 

END 
+0

私はCASE文を使用しようとしていましたが、そうではありませんか? http://www.w3resource.com/mysql/mysql-procedure.php#MIF –

+1

@AndréFecteau。 。 。これより前にコードをもっと表示する必要があります。 '= null'は単に間違っていることにも注意してください。このため、私はあなたのすべてのコードがあまり書かれていないと思われます。 –

+0

を終了する場合は、ENDを使用する必要があります。私が別のコメントで言ったように、NULLでの等価性検査はIS NULLで行わなければならず、= –

答えて

2

case式は値を返します。テーブルに値を挿入するために使用することはできません。あなたはIF/ELSEが必要だと思います。

IF recordNotes is null AND sortNumber is null 
THEN INSERT INTO tempRecordHolder (union_ID,union_Name) VALUES (recordID, recordName); 
ELSE SET @blank='null'; 
END IF; 

またnull(= nullまたは<>ヌル)との比較は常にunknownを返します。 is nullを使用してください。

+0

それはそれを説明する、ありがとう! –

+0

いいえ、複雑な条件のストアドプロシージャでは 'case'を使用できます。あなたは 'case'内でも挿入を使うことができます。 'is null'は良い点です。この特殊なケースでは'¬case'の代わりに 'if'を使うこともできますが、質問のコードが提供されたエラーメッセージを返す理由を説明できません。 – Shadow

+0

@Shadow私の元の計画はIF/ELSEを使用することでしたが、私はCASE文を使ってクリーナーを作ろうと考えていましたが、CASE文は上記の他のコメントからは機能しません。 –

関連する問題