2017-12-14 2 views
0

プロシージャの最後に値を設定しようとすると、OUTパラメータIDが未定義の名前であると不平を言うエラーが表示されます。それをコメントアウトすると、プロシージャは正常に実行されます。 私は何が間違っていますか?OUT DB2のストアドプロシージャのパラメータの問題

CREATE PROCEDURE P3.CUST_CRT(IN NAME VARCHAR(15), 
          IN GENDER CHAR(1), 
          IN AGE INTEGER, 
          IN PIN INTEGER, 
          OUT ID INTEGER) 
LANGUAGE SQL 
P1: BEGIN 
     --Check if Customer NAME is NULL. 
     IF NAME IS NULL THEN 
       SIGNAL SQLSTATE VALUE '20010' 
       SET MESSAGE_TEXT = 'No NAME.'; 
     END IF; 
     --Check if Customer NAME is an empty string. 
     IF NAME = '' THEN 
       SIGNAL SQLSTATE VALUE '20020' 
       SET MESSAGE_TEXT = 'NAME cannot be an empty string.'; 
     END IF; 
     --Check if Customer GENDER falls in either of the two acceptable categories. 
     IF GENDER NOT IN ('M','F') THEN 
       SIGNAL SQLSTATE VALUE '20030' 
       SET MESSAGE_TEXT = 'GENDER can either be M or F'; 
     END IF; 
     --Check if Customer AGE is not null. 
     IF AGE IS NULL THEN 
       SIGNAL SQLSTATE VALUE '20040' 
       SET MESSAGE_TEXT = 'AGE cannot be NULL'; 
     END IF; 
     --Check that AGE is not negative. 
     IF AGE < 0 THEN 
       SIGNAL SQLSTATE VALUE '20060' 
       SET MESSAGE_TEXT = 'AGE cannot be negative.'; 
     END IF; 
     --Check that the Customer is an adult. 
     IF AGE < 18 THEN 
       SIGNAL SQLSTATE VALUE '20070' 
       SET MESSAGE_TEXT = 'You have to be over 18 years to have an account.'; 
     END IF; 
     --Check that PIN is not null. 
     IF PIN IS NULL THEN 
       SIGNAL SQLSTATE VALUE '20080' 
       SET MESSAGE_TEXT = 'PIN cannot be empty.'; 
     END IF; 
     --Pin cannot be less than zero. 
     IF PIN < 0 THEN 
       SIGNAL SQLSTATE VALUE '20090' 
       SET MESSAGE_TEXT = 'PIN cannot be less than 0.'; 
     END IF; 

     INSERT INTO P3.CUSTOMER(Name, Gender, Age, Pin) VALUES(NAME, GENDER, AGE, P3.ENCRYPT(PIN)); 
     SET ID = ID.CURRVAL; 
END P1 @ 

答えて

1

Db2サーバーのバージョンとオペレーティングシステムを指定してください。正確なエラーメッセージとエラーコードを指定しないかぎり、「エラーが発生しました」とは書かないでください。コードでは、 "ID"という名前のシーケンスオブジェクトがスキーマにあると想定しており、出力パラメータ名をシーケンス名と同じにすることはできません。配列オブジェクトに出力パラメータと異なる名前を付けます

「コード:-204、SQLの状態:42704」「DB2ADMIN.ID」は未定義の名前です。SQLCODE = -204、SQLSTATE = 42704、DRIVER = 4.22 Db2は、出力パラメータ(IDという名前)がシーケンスオブジェクトと同じ名前で、Db2がデータベースに接続しているスキーマであるDB2ADMINというスキーマ内でシーケンスオブジェクトを見つけることができないことを伝えていますコンパイルを行う。

したがって、シーケンスオブジェクト名を修飾するか(たとえば、シーケンスの完全修飾名であればP3.IDなどの前にスキーマ名を指定するか、シーケンスオブジェクトに正しいフルネームを指定します)

シーケンスの次の値(現在の値のみを使用します)を消費するコードは不明ですが、これはコードとは別の問題です-2024 - 言い換えれば、他のエラーがある可能性があります。

最も最近消費されたシーケンス値を返すようにしている場合、一方向(よりエレガントな方法を含む他の方法があります)行うには、それは(この例では、シーケンス・オブジェクトはP3.THEIDとして事前に作成されている)、このようなものです:CURRVAL機能を利用するためには、それが定義する必要がありながら

INSERT INTO P3.CUSTOMER(ID, Name, Gender, Age, Pin) VALUES(NEXT VALUE FOR P3.THEID , NAME, GENDER, AGE, P3.ENCRYPT(PIN)); 

SET ID = P3.THEID.CURRVAL; 
+0

私はWindows Expressマシンでdb2 express c 32ビットを使用しています。 DB2ADMINは、デフォルト・スキーマの名前です。コードを実行しているスキーマはP3です。これは私が取得しているエラーです:[コード:-204、SQLの状態:42704] "DB2ADMIN.ID"は未定義の名前です.. SQLCODE = -204、SQLSTATE = 42704、DRIVER = 4.22.29。 – TheMokuaBrand

+0

この方法ですか? P3.ID.CURRVALをIDからP3.CUSTOMERに選択します。残念ながら、DB2ADMIN.IDではなくP3.IDで同じエラーが発生しています。私がINSERTで明示的にシーケンスを使用していないという事実は問題でしょうか?私は、プロシージャの最後の挿入の主キー(ID)を返すようにします。 – TheMokuaBrand

1

あなたのID変数がINTEGERとして定義されていますSEQUENCEオブジェクトとして扱います。

+0

ええ問題はシーケンスだった。 @マオの答えから、私はそれを問題として特定することができました。 – TheMokuaBrand

関連する問題