IBM DB2中的SQL存储过程

IBM DB2中的SQL存储过程,sql,stored-procedures,db2,ibm-cloud,db2-luw,Sql,Stored Procedures,Db2,Ibm Cloud,Db2 Luw,我正在尝试使用IBMDataStudio工具(eclipse)在IBMDB2仓库中创建一个存储过程。我在使用从游标获取数据的变量时遇到问题。以下是工作版本,返回我希望的日期: 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

我正在尝试使用IBMDataStudio工具(eclipse)在IBMDB2仓库中创建一个存储过程。我在使用从游标获取数据的变量时遇到问题。以下是工作版本,返回我希望的日期:

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\u异常\u事件\u创建者-已启动调试部署。 创建存储过程返回SQLCODE:-206,SQLSTATE:42703。 SEXERGITEST.ML\u异常\u事件\u创建者:14:“MAX\u DATE”在使用它的上下文中无效。。SQLCODE=-206,SQLSTATE=42703,DRIVER=4.18.60 “MAX_DATE”在使用它的上下文中无效。。SQLCODE=-206,SQLSTATE=42703,DRIVER=4.18.60 SEXERGITEST.ML\u异常\u事件\u创建者-部署以进行调试失败。 SEXERGITEST.ML\u异常\u事件\u创建者-回滚已成功完成


我做错了什么?

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

正如评论员指出的,
MAX\u 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);

您没有声明变量MAX_DATE。(不需要,使用第一个选择作为第二个选择的条件。)为什么要将光标用于单例选择(问题中显示的第二个存储过程中的max_date_光标)?除了包含max date的未定义主机变量外,还应重新考虑代码。块中的所有
DECLARE
语句必须位于所有可执行语句之前。在此之前必须声明所有变量(例如,
MAX\u DATE
),您没有声明变量MAX\u DATE。(不需要,使用第一个选择作为第二个选择的条件。)为什么要将光标用于单例选择(问题中显示的第二个存储过程中的max_date_光标)?除了包含max date的未定义主机变量外,还应重新考虑代码。块中的所有
DECLARE
语句必须位于所有可执行语句之前。在此之前必须声明所有变量(例如,
MAX_DATE
)。