2013-03-31 131 views
1

我特林DB2過程中執行的查詢EXECUTE語句的變量:DB2 - 如何將值分配給在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); 
[email protected] 

這給了以下錯誤:

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_ARQUCOD_TIPO_ARQU值動態?

ThankYou。

回答

2

問題是你是從執行設定結果的方式:

EXECUTE stmt1 into VAR_COD_TIPO_ARQU ; 

這是執行succefuly

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; 
EXECUTE stmt1 into VAR_COD_TIPO_ARQU ; 
[email protected] 
+2

嗨@AngocA, 我回答:'執行stmt1到VAR_COD_TIPO_ARQU;' 但是它給我一個錯誤: 'SQL0518N在EXECUTE語句中命名的語句不處於準備狀態,或者是SELECT或VALUES語句。 SQLSTATE = 07003' –

2

喜完整的代碼是正確的solutuion:

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。

0

我知道自從問這個問題以來已經有一段時間了,但是我發現沒有給出的答案有效。

@ 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 ; 
[email protected] 

注意,現在執行的命令是set語句和SELECT內,而不是一個純粹的SELECT聲明。這就是訣竅所​​在。