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)