2013-04-11 85 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語法)。

進行此更改應該可以解決您的問題。

我很驚訝,把它放在一行上使它工作,但我不希望有任何區別(有一個選項可自動將行作爲語句終止符,但您沒有它在)。