DB2儲存過程雜談

2021-07-24 23:21:34 字數 4472 閱讀 8212

db2常用的異常處理方式分為三種:undo(回滾)、exit(退出)、continue(繼續執行)

declare undo|exit|continue handler for

異常處理的物件可以為針對指定的sqlstate**

declare undo|exit|continue handler for sqlstate ***x

也可以針對某些condition,如sql異常,sql警告,以及游標末尾

declare undo|exit|continue handler for sqlexception|sqlwarning|not found

異常處理的內容 ,可以是一些回滾,提交語句,也可以是日誌記錄等

declare undo|exit|continue handler for sqlexception 

begin

--異常處理內容

end;

通常如何使用get diagnostics語句

解答:使用get diagnostics 變數 = row_count語句可以獲取最後一次執行insert、update或delete之後的記錄數;db2 sql pl 支援get diagnostics語句獲取sql語句執行的資訊,它可以用來返回condition handler的錯誤資訊;get diagnostics exception 1 變數 = message_text;但這樣就不能再獲取行數了。注意:get diagnostics語句是不支援select和select into語句的。

(1):case

when 條件  then 結果1     (條件為:true/false)

when 條件2  then 結果12

when 條件3  then 結果13

else            結果2

end(2):case 表示式1

when 表示式2   then 結果1    (當表示式1==表示式2)

when 表示式3   then 結果13

when 表示式4   then 結果14

else            結果2

endleft(arg,length)、right(arg,length)

left,right 分別返回arg的最左邊或最右邊length個字元,arg可以是字元或string

cast(n as type)將引數n轉換為type型。

比如select cast(1 as float)/3 from sysibm.sysdummy1; ---將1轉換為float型,然後除以3.

select cast(1 as decimal(10,2))/3 from sysibm.sysdummy1;  --將1轉換為decimal(10,2)型,然後除以3.

select cast(1111 as char(4)) from sysibm.sysdummy1;  --將1111轉換為字元型的'1111',要注意的是不可以轉換為varchar,這是db2不允許的。

動態sql

-----

prepare  from

261.----定義     

262.    declare cc varchar(4000); 

263.    declare sqlstr varchar(4000); 

264.    declare st statement;     

265.    declare cur cursor with return to client for cc; 

266. 

267.----執行動態sql不返回 

268.    prepare st from sqlstr; 

269.    execute st; 

--------

在動態 sql中呼叫儲存過程,如果儲存過程中帶有引數,必須要用到into和using 引數

對應的每乙個in和inout的引數需要乙個using的宿主變數,對於每個out和inout的引數需要乙個into的宿主變數,

例如:proc1(in param1, out param2)

set call_statement = 'call proc1(?,?)'

prepare s1 from call_statement

execute s1 into myvar2 using myvar1;

proc2(in param1, inout param2)

set call_statement = 'call proc2(?,?)'

prepare s1 from call_statement

execute s1 into myvar2 using myvar1, myvar2;

.建立臨時表

declare global temporary table 語句來定義臨時表。db2的臨時表是基於會話的,且在會話之間是隔離的。當會話結束時,臨時表的資料被刪除,臨時表被隱式卸下。對臨時表的定義不會在syscat.tables中出現.

eg: declare global temporary table session.temp_k_cig (cig varchar(20)) with replace not logged on commit preserve rows;

其中not logged 指不記錄事務日誌,with replace 指在程式結束後自動刪除該臨時表

1). db2的臨時表需要用命令declare temporary table來建立, 並且需要建立在使用者臨時表空間上;

2). db2在資料庫建立時, 預設並不建立使用者臨時表空間, 如果需要使用臨時表, 則需要使用者在建立臨時表之前建立使用者臨時表空間;

3). 臨時表的模式為session,session即基於會話的,且在會話之間是隔離的。當會話結束時,臨時表的資料被刪除,臨時表被隱式卸下。對臨時表的定義不會在syscat.tables中出現 .;

4). 預設情況下, 在commit命令執行時, db2臨時表中的所有記錄將被刪除; 這可以通過建立臨時表時指定不同的引數來控制;

5). 執行rollback命令時, 使用者臨時表將被刪除;

還提供on commit preserve rows, 和on commit delete rows功能。

但是只提供global功能,意即表本身不會自動刪除。 只是提供是否保留資料的功能。這樣,preserve rows相當於會話級,而on commit delete rows則相當於事務級的臨時表了。用處還是蠻

大的為什麼需要定義臨時表:只有當我們在乙個工作單元中的多條sql語句中使用同一臨時集合時,我們才需要定義臨時表。臨時表(temporary table)通常應用在需要定義臨時集合的場合。但是,在大部分需要臨時集合的時候,我們根本就不需要定義臨時表。當我們在一條sql語句中只使用一次臨時集合時,我們可以使用巢狀表表示式來定義臨時集合;當我們在一條sql語句中需要多次使用同一臨時集合時,我們可以使用公共表表示式

儲存過程:沒有返回值;對於sqlserver、db2,可以進行查詢、插入、更新、刪除操作

函式:有返回值;對於sqlserver、db2,不可以進行插入、更新、刪除操作

----db2 merge into語句的使用

db2中的merge語句可以將乙個表中的資料合併到另乙個表中,在合併的同時可以根據條件進行插入、刪除、更新等操作,功能非常強大。

語法如下:

merge into table_name alias1

using (table|view|sub_query) alias2

on (join condition)

when matched then

update table_name set col1 = col_val1,col2 = col2_val

when not matched then

insert (column_list) values (column_values)

關鍵字、引數

into子句 

在into子句中指定所要修改或者插入資料的目標表

using子句 

在using子句中指定用來修改或者插入的資料來源。資料來源可以是表、檢視或者乙個子查詢語句。

on子句 

在on子句中指定執行插入或者修改的滿足條件。

when matched | not matched 

用該子句通知資料庫如何對滿足或不滿足條件的結果做出相應的操作。可以使用以下的兩類子句。

merge_update子句 

merge_update子句執行對目標表中的字段值修改。當在符合on子句條件的情況下執行。如果修改子句執行,則目標表上的修改觸發器將被觸發。

------------

db2的命令列執行,登陸系統

su - db2odb  

db2 connect to tsodb

db2 "select 1 from syscat.columns where colname='col1' and tabname='tab1' and tabschema='sch1'"

db2儲存過程批量插入資料 db2儲存過程批量更新

db2儲存過程批量更新 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公共...

db2儲存過程批量插入資料 db2儲存過程批量提交

db2儲存過程批量提交 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公共...

DB2儲存過程模版

1 日誌表 create table joblog jobfun varchar 50 儲存過程的功能 procname varchar 100 儲存過程 runtime varchar 50 執行時間 currentuser varchar 50 當前使用者 state varchar 4 狀態c...