2016-08-11 54 views
1

我想聲明並設置通過遊標返回結果集的存儲過程中的變量值。我這樣做是因爲我計劃變量來幫助過濾結果。iSeries IDB2 - 在存儲過程中聲明返回結果集的變量

當我只用光標我的發言一切正常。這裏是代碼爲:

CREATE OR REPLACE PROCEDURE MYLIB.MYTEST() 
DYNAMIC RESULT SETS 1 
LANGUAGE SQL 
SPECIFIC MYTEST 
NOT DETERMINISTIC 
READS SQL DATA 
CALLED ON NULL INPUT 

BEGIN 

DECLARE C1 CURSOR WITH RETURN FOR 
SELECT * FROM SOMELIB.SOMEFILE 
FETCH FIRST 100 ROWS ONLY; 
OPEN C1; 
END; 

當我嘗試聲明和設置變量,因爲我得到一個錯誤。下面的代碼:

CREATE OR REPLACE PROCEDURE MYLIB.MYTEST() 
DYNAMIC RESULT SETS 1 
LANGUAGE SQL 
SPECIFIC MYTEST 
NOT DETERMINISTIC 
READS SQL DATA 
CALLED ON NULL INPUT 

BEGIN 

DECLARE SOMENAME VARCHAR(10); 
SET SOMENAME = 'JOHN'; 

DECLARE C1 CURSOR WITH RETURN FOR 
SELECT * FROM SOMELIB.SOMEFILE WHERE LASTNAME = SOMENAME 
FETCH FIRST 100 ROWS ONLY; 
OPEN C1; 
END; 

我收到的錯誤是:

SQL State: 42601 
Vendor Code: -104 
Message: [SQL0104] Token C1 was not valid. Valid tokens: GLOBAL. 
Cause . . . . . : A syntax error was detected at token C1. 
Token C1 is not a valid token. A partial list of valid tokens is GLOBAL.  
This list assumes that the statement is correct up to the token. 
The error may be earlier in the statement, but the syntax of the statement 
appears to be valid up to this point. Recovery . . . : 
Do one or more of the following and try the request again: -- 
Verify the SQL statement in the area of the token C1. Correct the statement. 
The error could be a missing comma or quotation mark, it could be a 
misspelled word, or it could be related to the order of clauses. -- 
If the error token is <END-OF-STATEMENT>, correct the SQL statement 
because it does not end with a valid clause. 

誰能告訴我要聲明,並在返回結果集的存儲過程中設置變量的正確語法?它甚至有可能嗎?

回答

5

您需要完成可執行代碼之前完成的所有DECLARE。移動SET

CREATE OR REPLACE PROCEDURE MYLIB.MYTEST() 
DYNAMIC RESULT SETS 1 
LANGUAGE SQL 
SPECIFIC MYTEST 
NOT DETERMINISTIC 
READS SQL DATA 
CALLED ON NULL INPUT 

BEGIN 

-- Declaration statements 
DECLARE SOMENAME VARCHAR(10); 
DECLARE C1 CURSOR WITH RETURN FOR 
SELECT * FROM SOMELIB.SOMEFILE WHERE LASTNAME = SOMENAME 
FETCH FIRST 100 ROWS ONLY; 

-- Executable statements 
SET SOMENAME = 'JOHN'; 
OPEN C1; 
END; 
+0

非常感謝你回答那個查爾斯。 – Cesar