1

我正在使用 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
4

2 回答 2

2

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

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

使用-tdX选项将语句终止符设置为其他内容。我!在 DB2 中用作标准语句终止符,它对我很有效(它在 DB2 语法中不使用,除了!=,可以替换为<>)。

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

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

于 2013-04-11T08:41:55.150 回答
2

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

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

测试.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 目录以查看定义的存储过程和“主体”。

于 2013-04-11T09:22:20.733 回答