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

Stored procedures DB2存储过程中的OUT参数问题,stored-procedures,db2,sql-pl,Stored Procedures,Db2,Sql Pl,当我试图在过程结束时设置OUT参数的值时,我收到一个错误,抱怨OUT参数ID是一个未定义的名称。注释掉它,程序执行得很好。 我做错了什么 CREATE PROCEDURE P3.CUST_CRT(IN NAME VARCHAR(15), IN GENDER CHAR(1), IN AGE INTEGER, IN PIN

当我试图在过程结束时设置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 @
创建程序P3.CUST_CRT(以VARCHAR(15)的名义),
在性别特征(1)中,
在AGE INTEGER中,
在PIN整数中,
输出ID(整数)
语言SQL
P1:开始
--检查客户名称是否为空。
如果名称为空,则
信号状态值“20010”
设置消息_TEXT='无名称';
如果结束;
--检查客户名称是否为空字符串。
如果NAME='',则
信号状态值“20020”
SET MESSAGE_TEXT='名称不能为空字符串';
如果结束;
--检查客户性别是否属于两个可接受类别中的任何一个。
如果性别不在('M','F'),那么
信号状态值“20030”
SET MESSAGE_TEXT='性别可以是M或F';
如果结束;
--检查客户年龄是否不为空。
如果年龄为空,则
信号状态值“20040”
设置消息_TEXT='年龄不能为空';
如果结束;
--检查年龄是否为负。
如果年龄<0,则
信号状态值“20060”
设置MESSAGE_TEXT='年龄不能为负';
如果结束;
--检查客户是否为成年人。
如果年龄小于18岁,则
信号SQLSTATE值“20070”
设置MESSAGE_TEXT='您必须年满18岁才能拥有帐户';
如果结束;
--检查PIN码是否不为空。
如果PIN为空,则
信号状态值“20080”
设置消息_TEXT='PIN不能为空';
如果结束;
--Pin不能小于零。
如果PIN<0,则
信号状态值“20090”
设置消息_TEXT='PIN不能小于0';
如果结束;
插入P3.客户(姓名、性别、年龄、Pin)值(姓名、性别、年龄、P3.加密(Pin));
设置ID=ID.CURRVAL;
P1端@

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

对于“Code:-204,SQL State:42704]”,“DB2ADMIN.ID”是一个未定义的名称。.SQLCODE=-204,SQLSTATE=42704,DRIVER=4.22.29”,Db2告诉您输出参数(名为ID)与序列对象具有相同的名称,Db2在名为DB2ADMIN的模式中找不到sequence对象,而DB2ADMIN就是连接到数据库进行编译的模式

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

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

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


请求帮助时,请始终指定您的Db2服务器版本和操作系统。除非您指定了确切的错误消息和错误代码,否则不要编写“getting a error”(获取错误)。您的代码假定您命名的序列对象为“ID”在架构中,您不应允许输出参数名称与序列名称相同。请为序列对象指定与输出参数不同的名称

对于“Code:-204,SQL State:42704]”,“DB2ADMIN.ID”是一个未定义的名称。.SQLCODE=-204,SQLSTATE=42704,DRIVER=4.22.29”,Db2告诉您输出参数(名为ID)与sequence对象同名,并且Db2在名为DB2ADMIN的模式中找不到sequence对象,该模式是连接到数据库进行编译的模式

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

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

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


ID变量定义为整数,而要使用CURRVAL函数,它必须定义为序列对象。

ID变量定义为整数,而要使用CURRVAL函数,它必须定义为序列对象。

我在windows 8.1机器上使用db2 express c 32位。DB2ADMIN是默认模式。我正在运行代码的模式是P3。这是我得到的错误:[code:-204,SQL状态:42704]“DB2ADMIN.ID”是一个未定义的名称..SQLCODE=-204,SQLSTATE=42704,DRIVER=4.22.29。这样做吗?从P3.CUSTOMER中选择P3.ID.CURRVAL作为ID;不幸的是,它是s
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;