我正在玩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
答案 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目录以查看已定义的存储过程和“实体”。