我是db2和存储过程的新手我创建了一个存储过程来将记录插入数据库但是存储过程不起作用,代码如下:
drop procedure product_create ;
CREATE PROCEDURE product_Create(
out errmsg char(256),
in inCucode char(6),
in inProdCode char(25),
in inDescription char(80),
in inUPC char(25),
in inuom char(3),
in instdpack decimal(5,0),
in inweight decimal(9,4),
in inlength decimal(9,4),
in inwidth decimal(9,4),
in inheight decimal(9,4)
)
language sql
BEGIN
if errmsg = ' '
insert INTO prmast
( prcucd,
prprcd,
prdes1,
prupc#,
prworu,
prwuts,
prntwt,
prlong,
prwide,
prhigh
)
values ( inCucode,
inProdCode,
inDescription,
inUPC,
inuom,
instdpack,
inweight,
inlength,
inwidth,
inheight,
) ;
end if ;
return ;
end
这是存储过程中插入查询的正确结构吗?如果忘记了任何内容,我们将非常感谢您的帮助。
答案 0 :(得分:0)
我将您的问题转载如下:
CREATE TABLE prmast(prcucd char(6), prprcd char(25), prdes1 char(80), prupc# char(25), prworu char(3), prwuts dec(5,0), prntwt dec(9,4), prlong dec(9,4), prwide dec(9,4), prhigh dec(9,4));
编写存储过程并将其保存到名为sol.txt
CREATE OR REPLACE PROCEDURE product_Create(
out errmsg char(5),
in inCucode char(6),
in inProdCode char(25),
in inDescription char(80),
in inUPC char(25),
in inuom char(3),
in instdpack decimal(5,0),
in inweight decimal(9,4),
in inlength decimal(9,4),
in inwidth decimal(9,4),
in inheight decimal(9,4)
)
language sql
BEGIN
DECLARE SQLSTATE CHAR(5);
Insert INTO prmast
( prcucd,
prprcd,
prdes1,
prupc#,
prworu,
prwuts,
prntwt,
prlong,
prwide,
prhigh
)values
( inCucode,
inProdCode,
inDescription,
inUPC,
inuom,
instdpack,
inweight,
inlength,
inwidth,
inheight
) ;
SET errmsg = SQLSTATE;
end@
运行程序:db2 -td@ -vf sol.txt
然后,我打电话给程序:
db2 "call product_Create(?, 'a','b','c','d','e',6,7,8,9,10)"
输出参数值
参数名称:ERRMSG 参数值:00000
返回状态= 0`
验证是否有效:
`db2 select * from prmast
PRCUCD PRPRCD PRDES1 PRUPC#PRWORU PRWUTS PRNTWT PRLONG PRHIDE PRHIGH
a b c d e 6. 7.0000 8.0000 9.0000 10.00 00
选择了1条记录。
您的手术有几点需要注意:
您可以使用CREATE OR REPLACE PROCEDURE
来定义您的程序。它将删除现有的过程定义,并将其替换为您刚刚运行的定义。换句话说,您不必明确DROP PROCEDURE
char(255)
超出范围。声明输出" errmsg"因为char(5)
应该足够好了。
您可以使用SET
语句显式检查您的SQL语句是否成功执行。
过程末尾的@
符号表示不使用;
作为语句结尾的db2,因为您使用;
作为SQL语句的结尾,属于存储过程定义的一部分。这也是您在执行clp时使用-td@
选项的原因。这告诉DB2使用@
而不是;
作为语句结束符号。
此外,列{" inheight"后面有,
,这是最后一列,不应该有,
调用存储过程时,需要?
作为" OUT"的占位符。参数。
还有一点需要注意,如果你想从另一个表的选择结果中插入值,你可能想要使用" cursor"而不是显式地将值提供给存储过程。