2

db2 プロシージャでクエリを実行しようとしています。

CREATE OR REPLACE PROCEDURE TEST (IN indbnm VARCHAR(30), IN intblnm VARCHAR(30))
LANGUAGE SQL
BEGIN
DECLARE statmnt2 VARCHAR(1000); 
DECLARE VAR_COD_TIPO_ARQU CHAR(1);  
DECLARE stmt1 STATEMENT; 

SET statmnt2 = 'SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY';
PREPARE stmt1 FROM statmnt2;
SET VAR_COD_TIPO_ARQU = EXECUTE (stmt1);
END@

これにより、次のエラーが発生します。

DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0206N  "STMT1" is not valid in the context where it is used.  LINE 
NUMBER=33.  SQLSTATE=42703

値を動的に設定VAR_COD_TIPO_ARQUする正しい方法は何ですか?COD_TIPO_ARQU

ありがとうございました。

4

4 に答える 4

2

こんにちは、それは正しい解決策です:

SET statmnt = 'SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY';
PREPARE stmt1 FROM statmnt;

BEGIN 
    DECLARE c1 CURSOR FOR stmt1;
    OPEN c1;
    FETCH c1 into sttmresult;
    CLOSE c1;
END;

TY.

于 2013-04-03T09:30:13.773 に答える
2

この質問が出されてからしばらく経ちましたが、与えられた回答のどれもうまくいかないことがわかりました。

@AngocAの解決策は近かったが、@Mani_Swethaが指摘したように、ビットEXECUTEが原因でステートメントが失敗する.SELECT

ウェブ上のソリューションを検索して組み合わせた後、これが最終的に私にとってうまくいきました。

CREATE OR REPLACE PROCEDURE TEST (IN indbnm VARCHAR(30), IN intblnm VARCHAR(30))
LANGUAGE SQL
BEGIN
DECLARE statmnt2 VARCHAR(1000); 
DECLARE VAR_COD_TIPO_ARQU CHAR(1);  
DECLARE stmt1 STATEMENT; 

SET statmnt2 = 'set ? = (SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY)';
PREPARE stmt1 FROM statmnt2;
EXECUTE stmt1 into VAR_COD_TIPO_ARQU ;
END@

実行されたコマンドは、純粋なステートメントではなくset、内部を含むステートメントになっていることに注意してください。これがトリックを作るものです。SELECTSELECT

于 2016-01-08T10:57:41.813 に答える