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