SQL - IBM DB2中的存储过程

时间:2018-03-19 10:22:14

标签: sql stored-procedures db2 ibm-cloud db2-luw

我正在尝试使用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。 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 - 回滚成功完成。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

正如评论员指出的那样,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);