2013-04-11 87 views
1

我正在玩db2存储过程,并且我正在努力解读以下概念。 当我创建下面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 
+1

你是在命令行上输入的吗?如果是这样,你需要转义新的行字符。最好还是把所有的定义放在一个文件中并处理完整的文件。 – 2013-04-11 03:15:28

+0

@詹姆斯安德森:我已经这样做了。该代码位于名为test.sql的文件中,我使用以下命令'db2 -v -t -f test.sql -m -z xti.out'。ONce再次看起来像它读取时执行那些行。 – 2013-04-11 07:08:12

+0

请在您的问题或标签中指出这是一个关于DB2 LUW的问题。此行为不适用于其他平台。 – WarrenT 2013-04-11 11:41:47

回答

2

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

例如,如果你有一个名为TEST.SQL用刀片和存储过程定义的脚本文件,那么你确定指标将是:

TEST.SQL

insert into mytable (a) values ('a')@ 
create procedure test() 
    begin 
    insert into mytable (a) values ('b'); 
    [email protected] 

你会执行通过这个命令

db2 [email protected] -f test.sql 

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

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

为了确保您插入了什么,您可以查询DB2目录以查看定义的存储过程和“主体”。

2

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

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

将语句终止符设置为using the -tdX option。我使用!作为DB2中的标准语句终结符,并且它对我非常有用(除了!=,它可以替换为<>之外,它不用于DB2语法)。

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

我很惊讶,把它放在一行上使它工作,但我不希望有任何区别(有一个选项可自动将行作为语句终止符,但您没有它在)。