db2动态游标声明

时间:2019-01-08 18:52:08

标签: sql plsql db2

我正在尝试创建存储过程,但出现此错误

  

预期的令牌可能包括:“”。 LINE NUMBER = 17。 SQLSTATE = 42601

我的代码:

CREATE OR REPLACE PROCEDURE FETCH_EMP_SP(IN V_EMP_NAME VARCHAR(100),IN V_EMP_DEPT VARCHAR(100))
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE p_query_string  VARCHAR(100);
IF ((V_EMP_NAME IS NOT NULL) AND (V_EMP_DEPT IS NOT NULL)) THEN
    SET p_query_string = 'emp_name ='||V_EMP_NAME||' AND emp_dept='||V_EMP_DEPT||' WITH UR';
ELSEIF(V_EMP_DEPT IS NOT NULL) THEN
    SET p_query_string = ' AND emp_dept='||V_EMP_DEPT||' WITH UR';
ELSE
    SET p_query_string = ' WITH UR';
END IF;

DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR SELECT emp_name,emp_no,emp_dept,emp_location from employee where status=1 p_query_string;
OPEN C1;
END@

应成功执行

1 个答案:

答案 0 :(得分:2)

声明和声明不能在Compound SQL (compiled) statement

中以任意顺序出现

游标声明必须在变量声明之后,并且必须在SQL过程语句之后。

因此,将光标声明放置在变量声明之后。

此外,您的代码中还有许多其他错误。应该是这样的:

 implement an implicit PathBindable for this type..

查询文本中的字符串常量必须用单引号引起来。如果CREATE OR REPLACE PROCEDURE FETCH_EMP_SP(IN V_EMP_NAME VARCHAR(100),IN V_EMP_DEPT VARCHAR(100)) DYNAMIC RESULT SETS 1 LANGUAGE SQL BEGIN DECLARE p_query_string VARCHAR(256); DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR S1; IF ((V_EMP_NAME IS NOT NULL) AND (V_EMP_DEPT IS NOT NULL)) THEN SET p_query_string = ' AND emp_name ='''||V_EMP_NAME||''' AND emp_dept='''||V_EMP_DEPT||''' WITH UR'; ELSEIF(V_EMP_DEPT IS NOT NULL) THEN SET p_query_string = ' AND emp_dept='''||V_EMP_DEPT||''' WITH UR'; ELSE SET p_query_string = ' WITH UR'; END IF; SET p_query_string='SELECT emp_name,emp_no,emp_dept,emp_location from employee where status=1 '||p_query_string; PREPARE S1 FROM p_query_string; OPEN C1; END@ 是数字列,则不要这样做。