【问题标题】:Db2 stored procedure to insert要插入的 Db2 存储过程
【发布时间】:2016-01-25 02:13:00
【问题描述】:

我是 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

这是存储过程中插入查询的正确结构吗?我忘记了什么吗,我们将不胜感激。

【问题讨论】:

  • 你得到的错误是什么,为什么你在做INSERT之前检查errmsg = ' '..你的表结构是什么样的?
  • 不是在数据库中插入,errmsg = ' ' 是如果db2没有返回errmsg则在数据库中插入记录

标签: sql stored-procedures db2


【解决方案1】:

我将您的问题复制如下:

  1. 创建表“prmast”:

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));

  1. 编写存储过程并将其保存到名为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@

  2. 运行程序:db2 -td@ -vf sol.txt

  3. 然后,我调用这个过程:

    db2 "call product_Create(?, 'a','b','c','d','e',6,7,8,9,10)"

    输出参数的值


    参数名称:ERRMSG 参数值:00000

    返回状态 = 0`

  4. 验证它是否有效:

`db2 select * from prmast

PRCUCD PRPRCD PRDES1 PRUPC# PRWORU PRWUTS PRNTWT PRLONG PRWIDE 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”参数的占位符。

另外请注意,如果您想从另一个表的选择结果中插入值,您可能需要使用“游标”而不是显式地将值提供给您的存储过程。

【讨论】:

  • 感谢@Jerry 提供了很多帮助
  • @JohnPublic 很高兴为您提供帮助。你能接受这个答案吗?谢谢!
  • 我收到此错误:42704 和 PRMAST in *liblfile not found SQLCODE = -204 我用谷歌搜索但不确定要解决它@Jerry
  • @JohnPublic SQLCODE=-204 表示“对象未定义到 DB2”。您是否创建了 PRMAST 表?什么是 *liblfile?您可以在此处找到 SQL 代码错误消息的含义:en.wikipedia.org/wiki/DB2_SQL_return_codes
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多