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

时间:2017-12-14 09:26:06

标签: stored-procedures db2 sql-pl

当我尝试在过程结束时设置其值时,我收到一个错误,抱怨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 @

2 个答案:

答案 0 :(得分:1)

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

不同的名称

For&#34; Code:-204,SQL State:42704]&#34; DB2ADMIN.ID&#34;是一个未定义的名称.. SQLCODE = -204,SQLSTATE = 42704,DRIVER = 4.22.29&#34;,Db2告诉您输出参数(名称ID)与序列对象同名,并且Db2找不到模式中称为DB2ADMIN的序列对象 - 即连接到数据库以进行编译的模式。

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

从您的代码中不清楚您使用序列的下一个值(您只使用其当前值),但这与-204不同 - 换句话说,您可能有其他错误。

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

'product-<typeproduct:.{1,255}>-prd-<positionIds:[\d\-]+>.html' => 'site/products/bycate',

答案 1 :(得分:1)

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