sql - db2 动态游标声明
问题描述
我正在尝试创建存储过程,但出现此错误
预期的标记可能包括:“”。第 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@
应该成功执行
解决方案
复合 SQL(编译)语句中的声明和语句不能以任意顺序出现
游标声明必须跟在变量声明之后,并且必须跟在 SQL 过程语句之后。
因此,将游标声明放在变量声明之后。
此外,您的代码中还有许多其他错误。应该是这样的:
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@
查询文本中的字符串常量必须用单引号括起来。emp_dept
如果是数字列,请不要这样做。
推荐阅读
- vue.js - 在 Vue2JS 中观察 window.scrollY 和 router :id
- r - 从excel中的数据表在R中创建直方图
- docker - Docker 容器中的 SplunkForwarder 不接受来自 CLI 的身份验证
- swift - 产生多个 SKSpriteNodes
- python - 线性回归不良性能指标
- ios - 在 iOS UITest 中获取当前 GPS 位置
- android - Firebase 对象 firebaseAuth.SigninwithemailandPassword 给出 nullpointerException?
- opengl - 正确使用 GLTEXSubImage3D 的问题
- pact - 调用真实的 Web 服务代码以创建协议文件
- ruby-on-rails - 表格上相同型号的两个选择框