db2存储过程的创建行为

时间:2013-04-11 01:08:56

标签: stored-procedures db2 db2-luw

我正在玩db2存储过程,我正在努力解决以下概念。 当我创建一个像下面简单的存储过程

create or replace procedure test()
begin
insert into mytable(a) values ('a');
insert into mytable(a) values ('b');
insert into mytable(a) values ('c');
end

我可以看到mytable在创建过程中被填满了。 我期待使用'call test()'来插入我的数据,但我可以看到它不是我想的。我在这里做错了什么,或者它确实像这样工作?

为了避免这种奇怪的行为,我发现我需要将所有内容放在同一条线上并且我有我所期望的,即当我调用任何“创建或替换过程”时没有插入数据

create or replace procedure test() begin insert into mytable(a) values ('a'); insert  into mytable(a) values ('b');  insert into mytable(a) values ('c');     end

2 个答案:

答案 0 :(得分:2)

您正在使用-t选项,该选项指定;是语句终止符。

在编写过程或其他代码块时,不能使用分号作为语句终止符,因为整个过程声明需要被视为单个语句。 DB2正在将其分解为基于分号的多个语句。

将语句终止符设置为其他using the -tdX option。我在DB2中使用!作为我的标准语句终止符,它对我很有用(除了!=之外,它不在DB2语法中使用,可以用<>替换。)< / p>

进行此更改可以解决您的问题。

我很惊讶将它放在单行上使其工作,但是,我不希望这会产生任何影响(有一个选项可以自动将行视为语句终止符,但你没有它上)。

答案 1 :(得分:2)

问题是每条指令的终止字符。

例如,如果您有一个名为test.sql的脚本文件,其中包含插入内容和存储过程定义,那么您的定义将是:

TEST.SQL

insert into mytable (a) values ('a')@
create procedure test ()
  begin
    insert into mytable (a) values ('b');
  end@

您将通过此命令执行脚本

 db2 -td@ -f test.sql

@符号表示终止字符(选项-td @表示终止字符分隔符)。请注意,这是不同的; (半结肠)因为;在例程(存储过程,udf,触发器)中用作终止字符。

如您所见,'a'值将插入第一个插入中。 'b'值将从存储过程中插入。

为了确定您插入的内容,您可以查询DB2目录以查看已定义的存储过程和“实体”。