㈠ 請高手幫我看下,這段DB2sql(存儲過程)哪裡有問題,如何修改
1. w_id 這個是哪裡來的
2. commit;
end
;
把 end 後面的分號『;』改為』@『 --網路上說的,沒有玩過db2
commit;
end
@
3. other errors 我也看不懂了
㈡ db2 存儲過程 異常處理
存儲過程異常的處理:
DECLARE handler-type HANDLER FOR condition handler-action
異常處理器類型(handler-type)有以下幾種:
CONTINUE 在處理器操作完成之後,會繼續執行產生這個異常語句之後的下一條語句。
EXIT 在處理器操作完成之後,存儲過程會終止,並將控制返回給調用者。
UNDO 在處理器操作執行之前,DB2會回滾存儲過程中執行的SQL操作。在處理器操作完成之後,存儲過程會終止,並將控制返回給調用者。
異常處理器可以處理基於特定SQLSTATE值的定製異常,或者處理預定義異常的類。預定義的3種異常如下所示:
NOT FOUND 標識導致SQLCODE值為+100或者SQLSATE值為02000的異常。這個異常通常在SELECT沒有返回行的時候出現。
SQLEXCEPTIOIN 標識導致SQLCODE值為負的異常。
SQLWARNING 標識導致警告異常或者導致+100以外的SQLCODE正值的異常。
如果產生了NOT FOUND 或者SQLWARNING異常,並且沒有為這個異常定義異常處理器,那麼就會忽略這個異常,並且將控制流轉向下一個語句。如果產生了SQLEXCEPTION異常,並且沒有為這個異常定義異常處理器,那麼存儲過程就會失敗,並且會將控制流返回調用者。
以下示例聲明了兩個異常處理器。 EXIT處理器會在出現SQLEXCEPTION 或者SQLWARNING異常的時候被調用。EXIT處理器會在終止SQL程序之前,將名為stmt的變數設為"ABORTED",並且將控制流返回給調用者。UNDO處理器會將控制流返回給調用者之前,回滾存儲過程體中已經完成的SQL操作。
清單3:異常處理器示例
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED';
DECLARE UNDO HANDLER FOR NOT FOUND;
如果預定義異常集不能滿足需求,就可以為特定的SQLSTATE值聲明定製異常,然後再為這個定製異常聲明處理器。語法如下:
清單4:定製異常處理器
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
處理器可以由單獨的存儲過程語句定義,也可以使用由BEGIN…END塊界定的復合語句定義。注意在執行符合語句的時候,SQLSATE和SQLCODE的值會被改變,如果需要保留異常前的SQLSATE和SQLCODE,就需要在執行復合語句的第一個語句把SQLSATE和SQLCODE賦予本地變數或參數。
通常,會為存儲過程定義一個執行狀態的輸出參數(例如:poGenStatus)。
declare sqlcode integer default 0;
begin
declare continue handler for sqlexception set ret = sqlcode;
declare continue handler for sqlwarning set ret = sqlcode;
declare continue handler for not found set ret = sqlcode;
end ; --異常的聲明
--異常的處理
if sqlcode< 0 or sqlcode= 100 then
set O_RetCod = RetCode;
set O_RetMsg = 'CLN02:產品實例關聯客戶過程出錯!';
insert into LOG.OPER_LOG_TAB(PROC_NAME,OBJ_TAB,REGION_COD,OPER_COUNT,ERR_CODE,DATA_TIME,OPER_TIME)
values('P_DW_CLEAN','GLOBAL TEMP',0,0,retcode,CHAR(last_3_mon_time),current TIMESTAMP);
return;
else
set RetCode = 0;
end if;
㈢ db2存儲過程執行表和存儲過程就死鎖怎麼處理
1、建議獲取snapshot
for
application
以及snapshot
for
locks,應可以確定是哪一句發生了鎖。
2、如果能肯定是這一句,如果可以直接在最後加上
with
ur應該就可以了(如果業務邏輯容許的話)。
㈣ DB2中向目標表中取數,我修改了存儲過程中的兩個欄位的取數邏輯,並且left jion了兩張新表,
pc_id,screen_id哪個優先?以pc_id優先為例:
oracle用decode函數,sqlserver可以用case...when,給你個oracle的例子
create procere add_table
is
begin
insert into wip_led_opration(operation_id,led_pc_id,led_screen_id)
select operation_id,led_pc_id, decode(led_pc_id,null,led_screen_id,null)
-- 邏輯:第三列led_screen_id,先判斷led_pc_id是否為空,為空則用led_screen_id,非空即led_pc_id存在,則led_screen_id列位置留空
from fnd_led_pc ,fnd_led_screen ,fnd_operation
where fnd_operation.status=1
and fnd_led_screen.status=1
and fnd_led_pc.status=1
-- and fnd_operation.status=fnd_led_screen.status --這個條件是多餘的,兩個值都=1了
and fnd_led_screen.status=fnd_led_pc.status ;
end;
/* 另外提幾點建議
1. 建議給三個表加上別名
2. 多餘的連接條件我注釋掉了,雖然對執行計劃應該沒有太大影響
3. SELECT後最好標識出源表,比如fnd_operation.operation_id,這樣自己看著也清楚
*/
㈤ 用Dbvisualizer工具寫DB2存儲過程
dbvisualizer中執行命令是在:Help=》License Key。具體如下:
第一步:把下載的dbvis.puk文件,替換掉安裝目錄「D:\Program Files\DbVisualizer-6.0.12\lib」下dbvis.jar裡面的這個文件dbvis.puk。
第二步:然後打開軟體,選擇Help=》License Key ,然後下載導入dbvis.license文件。
第三步:重起一下軟體就可以了。
DbVisualizer是一個完全基於JDBC的跨平台資料庫管理工具,內置SQL語句編輯器,凡是具有JDBC資料庫介面的資料庫都可以管理,已經在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,Mimer SQL上通過測試。
㈥ DB2 存儲過程調用 存儲過程
給你一個鏈接,自己學習吧。
個人用過幾個月的DB2,覺得db2的存儲過程 調試最麻煩了。
http://bbs.csdn.net/topics/110040013
㈦ db2創建存儲過程錯誤,代碼如下,
CREATE OR REPLACE PROCEDURE BOOK_TICKET(IN ID INTEGER)
LANGUAGE SQL
BEGIN
DECLARE I INTEGER;
SET I=0;
IF I>0 THEN
UPDATE TICKET SET S_ID=1;
end if;
END
試試看