DB2存储过程中的OUT参数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2存储过程中的OUT参数问题相关的知识,希望对你有一定的参考价值。

当我尝试在过程结束时设置其值时,我收到一个错误,抱怨OUT参数ID为未定义的名称。评论它的程序执行正常。我究竟做错了什么?

CREATE PROCEDURE P3.CUST_CRT(IN NAME VARCHAR(15), 
                             IN GENDER CHAR(1), 
                             IN AGE INTEGER, 
                             IN PIN INTEGER,
                             OUT ID INTEGER)
LANGUAGE SQL
P1: BEGIN
        --Check if Customer NAME is NULL.
        IF NAME IS NULL THEN
                SIGNAL SQLSTATE VALUE '20010'
                SET MESSAGE_TEXT = 'No NAME.';
        END IF;
        --Check if Customer NAME is an empty string.
        IF NAME = '' THEN
                SIGNAL SQLSTATE VALUE '20020'
                SET MESSAGE_TEXT = 'NAME cannot be an empty string.';
        END IF;
        --Check if Customer GENDER falls in either of the two acceptable categories.
        IF GENDER NOT IN ('M','F') THEN
                SIGNAL SQLSTATE VALUE '20030'
                SET MESSAGE_TEXT = 'GENDER can either be M or F';
        END IF;
        --Check if Customer AGE is not null.
        IF AGE IS NULL THEN
                SIGNAL SQLSTATE VALUE '20040'
                SET MESSAGE_TEXT = 'AGE cannot be NULL';
        END IF;
        --Check that AGE is not negative.
        IF AGE < 0 THEN
                SIGNAL SQLSTATE VALUE '20060'
                SET MESSAGE_TEXT = 'AGE cannot be negative.';
        END IF;
        --Check that the Customer is an adult.
        IF AGE < 18 THEN
                SIGNAL SQLSTATE VALUE '20070'
                SET MESSAGE_TEXT = 'You have to be over 18 years to have an account.';
        END IF;
        --Check that PIN is not null.
        IF PIN IS NULL THEN
                SIGNAL SQLSTATE VALUE '20080'
                SET MESSAGE_TEXT = 'PIN cannot be empty.';
        END IF;
        --Pin cannot be less than zero.
        IF PIN < 0 THEN
                SIGNAL SQLSTATE VALUE '20090'
                SET MESSAGE_TEXT = 'PIN cannot be less than 0.';
        END IF;

        INSERT INTO P3.CUSTOMER(Name, Gender, Age, Pin) VALUES(NAME, GENDER, AGE, P3.ENCRYPT(PIN));
        SET ID = ID.CURRVAL;
END P1 @
答案

在寻求帮助时,请始终指定Db2服务器版本和操作系统。除非您指定确切的错误消息和错误代码,否则永远不要写“获取错误”。您的代码假定您命名为“ID”的序列对象在模式中,并且您不应允许输出参数名称与序列名称相同。为序列对象提供与输出参数不同的名称

对于“代码:-204,SQL状态:42704”,“DB2ADMIN.ID”是未定义的名称.SQLCODE = -204,SQLSTATE = 42704,DRIVER = 4.22.29“,Db2告诉您输出参数(名为ID) )与序列对象具有相同的名称,并且Db2在名为DB2ADMIN的模式中找不到序列对象 - 这是您连接到数据库以进行编译的模式。

因此,要么限定序列对象名称(即将模式名称放在它之前,例如P3.ID(如果这是您的序列完全限定名称),或为序列对象提供正确的全名。序列对象需要存在于代码编译之前的指定或隐含模式。

从你的代码中不清楚你在哪里消耗序列的下一个值(你只使用它的当前值),但这与-204是一个单独的问题 - 换句话说你可能有其他错误。

如果你试图返回最近消耗的序列值,那么一种方法(还有其他方法,包括更优雅的方法)就是这样(在这个例子中,序列对象预先创建为P3.THEID):

INSERT INTO P3.CUSTOMER(ID, Name, Gender, Age, Pin) VALUES( NEXT VALUE FOR P3.THEID , NAME, GENDER, AGE, P3.ENCRYPT(PIN));

SET ID = P3.THEID.CURRVAL;
另一答案

您的ID变量定义为INTEGER,而为了使用CURRVAL函数,它必须被定义为SEQUENCE对象。

以上是关于DB2存储过程中的OUT参数问题的主要内容,如果未能解决你的问题,请参考以下文章

db2 - 如何在shell中获取存储过程OUT型参数的返回值(awk)

DB2存储过程

如何使用 Perl DBI 检索 DB2 SQL 存储过程的返回值?

赵强老师Oracle存储过程中的out参数

赵强老师Oracle存储过程中的out参数

使用spring从db2数据库调用存储过程到java代码