【发布时间】:2018-08-27 20:54:19
【问题描述】:
我正在尝试使用 IBM Data Studio 工具 (eclipse) 在 IBM DB2 Warehouse 中创建一个存储过程。我在使用从游标中提取数据的变量时遇到问题。下面是工作版本,并根据我的意愿返回 DATE:
CREATE OR REPLACE PROCEDURE ML_ANOMALY_EVENT_CREATOR (OUT MAX_DATE TIMESTAMP(6))
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE MAX_DATE_CURSOR CURSOR FOR
SELECT DATETIME_END FROM ML_ANOMALY_EVENTS ORDER BY DATETIME_END DESC FETCH FIRST 1 ROWS ONLY;
OPEN MAX_DATE_CURSOR;
FETCH FROM MAX_DATE_CURSOR INTO MAX_DATE;
CLOSE MAX_DATE_CURSOR;
END P1
所以上面的作品。但是当我尝试在下面部署它时它失败了:
CREATE OR REPLACE PROCEDURE ML_ANOMALY_EVENT_CREATOR ()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE MAX_DATE_CURSOR CURSOR FOR
SELECT DATETIME_END FROM ML_ANOMALY_EVENTS ORDER BY DATETIME_END DESC FETCH FIRST 1 ROWS ONLY;
OPEN MAX_DATE_CURSOR;
FETCH FROM MAX_DATE_CURSOR INTO MAX_DATE;
CLOSE MAX_DATE_CURSOR;
DECLARE AD_DATA CURSOR WITH RETURN FOR
SELECT * FROM ML_AD_MV WHERE DATETIME > MAX_DATE AND ANOMALY=2 ORDER BY 2, 1;
OPEN AD_DATA;
END P1
然后我收到以下错误消息:
SEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 开始部署以进行调试。 创建存储过程返回 SQLCODE:-206,SQLSTATE:42703。 SEEXERGITEST.ML_ANOMALY_EVENT_CREATOR: 14: "MAX_DATE" 在使用它的上下文中无效.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.18.60 “MAX_DATE”在使用它的上下文中无效.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.18.60 SEEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 部署调试失败。 SEEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 回滚成功完成。
我做错了什么?
【问题讨论】:
-
您没有声明变量 MAX_DATE。 (不需要,使用第一个 SELECT 作为第二个 SELECT 的条件。)
-
为什么要使用光标进行单例选择(问题中显示的第二个存储过程中的 max_date_cursor)?除了包含最大日期的未定义主机变量之外,您应该重新考虑代码。
-
所有
DECLARE语句必须在块中的所有可执行语句之前。所有变量(例如MAX_DATE)必须在此之前声明。
标签: sql stored-procedures db2 ibm-cloud db2-luw