0

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

2 回答 2

1

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

于 2017-12-19T21:44:33.770 回答
1

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

对于 "Code: -204, SQL State: 42704] "DB2ADMIN.ID" is an undefined name.. 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;
于 2017-12-14T10:37:27.480 回答