2016-08-11 2 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