SQL - IBM DB2 中的存储过程
SQL - Stored Procedure in IBM DB2
我正在尝试使用 IBM Data Studio 工具 (eclipse) 在 IBM DB2 Warehouse 中创建一个存储过程。我在使用从游标中提取数据的变量时遇到问题。下面是工作版本和 returns 我希望的日期:
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 - 开始部署调试。
创建存储过程 returns SQLCODE:-206,SQLSTATE:42703。
SEXERGITEST.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
SEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 调试部署失败。
SEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 回滚成功完成。
我做错了什么?
正如评论员指出的那样,MAX_DATE
变量在第二个过程中未声明。它在第一个过程中被声明为一个 OUT
变量,所以这就是它起作用的原因。
你可以这样做:
CREATE OR REPLACE PROCEDURE ML_ANOMALY_EVENT_CREATOR ()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE AD_DATA CURSOR WITH RETURN FOR
SELECT * FROM ML_AD_MV WHERE DATETIME > (SELECT MAX(DATETIME_END) FROM ML_ANOMALY_EVENTS) AND ANOMALY=2 ORDER BY 2, 1;
OPEN AD_DATA;
END P1
或者如果您更喜欢以前的逻辑,您可以在声明游标之前声明 MAX_DATE 变量,如下所示:
DECLARE MAX_DATE TIMESTAMP(6);
我正在尝试使用 IBM Data Studio 工具 (eclipse) 在 IBM DB2 Warehouse 中创建一个存储过程。我在使用从游标中提取数据的变量时遇到问题。下面是工作版本和 returns 我希望的日期:
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 - 开始部署调试。 创建存储过程 returns SQLCODE:-206,SQLSTATE:42703。 SEXERGITEST.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 SEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 调试部署失败。 SEXERGITEST.ML_ANOMALY_EVENT_CREATOR - 回滚成功完成。
我做错了什么?
正如评论员指出的那样,MAX_DATE
变量在第二个过程中未声明。它在第一个过程中被声明为一个 OUT
变量,所以这就是它起作用的原因。
你可以这样做:
CREATE OR REPLACE PROCEDURE ML_ANOMALY_EVENT_CREATOR ()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE AD_DATA CURSOR WITH RETURN FOR
SELECT * FROM ML_AD_MV WHERE DATETIME > (SELECT MAX(DATETIME_END) FROM ML_ANOMALY_EVENTS) AND ANOMALY=2 ORDER BY 2, 1;
OPEN AD_DATA;
END P1
或者如果您更喜欢以前的逻辑,您可以在声明游标之前声明 MAX_DATE 变量,如下所示:
DECLARE MAX_DATE TIMESTAMP(6);