【发布时间】:2020-06-09 17:49:52
【问题描述】:
我为选择创建了动态存储过程。我将通过传递参数使用这个通用查询来执行多个选择语句。
DECLARE DESC_CSR CURSOR WITH HOLD FOR V_SQL;
SET V_SELECT =
'SELECT ' || SELECT_FIELDS ||
' FROM ' || TABLE_NAME ||
' WHERE ' || WHERE_CLAUSE ||
' WITH UR';
PREPARE V_SQL FROM V_SELECT;
OPEN DESC_CSR;
我将传递以下值。
SELECT_FIELDS = B.COLUMN_A INTO HOST_VAR_A
TABLE_NAME = TABLE_A A INNER JOIN TABLE_B B
ON A.ROW_ID = B.ROW_ID
WHERE_CLAUSE = A.COLUMN_B = HOST_VAR_B
当我这样做时,我得到“CURSOR DESC_CSR 未处于准备状态”。
如果我做错了,任何人都可以帮助我如何准备或纠正我。
【问题讨论】:
-
你只显示了你的 sproc 的一部分,但还不够。显示您的相关异常处理程序。在准备之前显示 exact 查询。按照您的平台(z/os、i-series、linux/unix/windows)的 Db2 知识中心中记录的 SQL0514N 说明进行操作。
-
@mao 感谢您的回复。下面将是我在 PREPARE 中的查询。看起来 CURSOR 不喜欢,因为我使用的是 INTO。
SELECT B.COLUMN_A INTO HOST_VAR_A FROM TABLE_A A INNER JOIN TABLE_B B ON A.ROW_ID = B.ROW_ID WHERE = A.COLUMN_B = HOST_VAR_B -
您尚未提供异常处理程序代码或 Db2-server 平台/版本详细信息。不要使用 cmets 添加新事实(它们会丢失),而是 EDIT 您的问题以添加新事实。除非 SELECT_FIELDS 包含
into子句,否则您的代码示例无法生成该查询。 -
另外,如果你有游标,为什么还要有 INTO 子句?单例选择不需要光标。
-
我尝试了不带 CURSOR 的 SELECT,例如
SET V_SELECT = 'SELECT ' || SELECT_FIELDS || ' FROM ' || TABLE_NAME || ' WHERE ' || WHERE_CLAUSE; || EXECUTE IMMEDIATE V_SELECT;,当将 SELECT_FIELDS 作为 COLUMN_A 传递到 HOST_VAR_A 时,我得到了 INTO CLAUSE IS NOT PERMITTED。
标签: stored-procedures dynamic db2 cobol