db2sql參數
⑴ db2cmd如何執行sql文件並傳遞參數
用多表連接查詢
⑵ Db2 中的sql 怎樣實現正則表達式的功能
盡管上面的函數按照預期的方式工作,但還可以改進它以獲得更佳的性能。註:函數內部的執行完成得越快,DB2 處理整個 SQL 語句的速度也就越快。
SQL 旨在處理多組行,這意味著通常會針對一個模式匹配多個行。在大多數情況下,模式本身對於整個 SQL 語句都是不變的;即,它不會隨行的更改而更改。 清單 5 中的 C 代碼展示了對每一行都調用函數 pcre_compile() ,該函數將給定模式轉換成內部表示法。
DB2 通過使用所謂的「高速暫存(scratchpad)」提供了在 UDF 調用之間傳遞信息的機制。此外,您可以標識特定調用「類型」;即它是對該 UDF 的第一次調用、普通調用還是最後一次(最終)調用。使用高速暫存和調用類型,有可能只對模式編譯一次,然後將該已編譯模式的內部表示法重用於對該 UDF 的所有後續調用。在最後一次調用時,釋放在處理期間分配的資源。
如 清單 6所示,對 CREATE FUNCTION 語句進行修改,告訴 DB2 向外部 C 代碼提供高速暫存和調用類型:
清單 6. 將高速暫存和調用類型添加到 CREATE FUNCTION 語句
CREATE FUNCTION regex2(pattern VARCHAR(2048), string CLOB(10M))
RETURNS INTEGER
SPECIFIC regexPerf
EXTERNAL NAME 'regexUdf!regexpPerf'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
NOT FENCED
RETURNS NULL ON NULL INPUT
NO SQL
NO EXTERNAL ACTION
SCRATCHPAD 50
FINAL CALL
ALLOW PARALLEL;
UDF 入口點看起來很不一樣,因為必須改寫函數內部的邏輯。參數方面唯一的更改是使用 SQLUDF_TRAIL_ARGS_ALL 代替了 SQLUDF_TRAIL_ARGS ,如 清單 7所示。
清單 7. regex2 的 C UDF 入口點
#include <pcre.h>
#include <sqludf.h>
// data structure mapped on the scratchpad for easier use and access
// to the objects
// the size of the scratchpad defined in the CREATE FUNCTION statement
// must be at least as large as sizeof(scratchPadMapping)
struct scratchPadMapping {
pcre *re;
pcre_extra *extra;
const char *error;
int errOffset;
};
void regexpPerf(
// input parameters
SQLUDF_VARCHAR *pattern, SQLUDF_CLOB *str,
// output
SQLUDF_INTEGER *match,
// null indicators
SQLUDF_NULLIND *pattern_ind, SQLUDF_NULLIND *str_ind,
SQLUDF_NULLIND *match_ind,
SQLUDF_TRAIL_ARGS_ALL) // SQLUDF_SCRAT & SQLUDF_CALLT
{
int rc = 0;
struct scratchPadMapping *scratch = NULL;
// map the buffer of the scratchpad and assume successful return
scratch = (struct scratchPadMapping *)SQLUDF_SCRAT->data;
*match_ind = 0;
switch (SQLUDF_CALLT) {
case SQLUDF_FIRST_CALL:
// initialize data on the scratchpad
scratch->re = NULL;
scratch->extra = NULL;
scratch->error = NULL;
scratch->errOffset = 0;
// compile the pattern (only in the FIRST call
scratch->re = pcre_compile(pattern, 0 /* default options */,
&scratch->error, &scratch->errOffset, NULL);
if (scratch->re == NULL) {
snprintf(SQLUDF_MSGTX, 70, "Regexp compilation failed at "
"offset %d: %s\\n", scratch->errOffset, scratch->error);
strcpy(SQLUDF_STATE, "38900");
rc = -1;
break;
}
// further analyze the pattern (might return NULL)
scratch->extra = pcre_study(scratch->re,
0 /* default options */, &scratch->error);
/* fall through to NORMAL call because DB2 expects a result
already in the FIRST call */
case SQLUDF_NORMAL_CALL:
// match the current string
rc = pcre_exec(scratch->re, scratch->extra, str->data,
str->length, 0, 0 /* default options */, NULL, 0);
switch (rc) {
case PCRE_ERROR_NOMATCH:
*match = 0;
rc = 0;
break;
case PCRE_ERROR_BADOPTION:
snprintf(SQLUDF_MSGTX, 70, "An unrecognized bit was set "
"in the options argument");
strcpy(SQLUDF_STATE, "38901");
rc = -1;
break;
case PCRE_ERROR_NOMEMORY:
snprintf(SQLUDF_MSGTX, 70, "Not enough memory available.");
strcpy(SQLUDF_STATE, "38902");
rc = -1;
break;
default:
if (rc < 0) {
snprintf(SQLUDF_MSGTX, 70, "A regexp match error "
"occured: %d", rc);
strcpy(SQLUDF_STATE, "38903");
rc = -1;
}
else {
*match = 1;
rc = 0;
}
break;
}
break;
}
// cleanup in FINAL call, or if we encountered an error in
// the FIRST call (DB2 will make a FINAL call if we encounter
// an error in any NORMAL call)
if (SQLUDF_CALLT == SQLUDF_FINAL_CALL ||
(SQLUDF_CALLT == SQLUDF_FIRST_CALL && rc < 0)) {
(*pcre_free)(scratch->re);
(*pcre_free)(scratch->extra);
}
return;
}
為了進一步改進該函數的性能,我添加了對函數 pcre_study() 的調用,該函數是由模式匹配引擎提供的。該函數進一步分析了該模式,並將額外的信息存儲在獨立的結構中。然後,在實際的匹配期間使用這些額外的信息來加快處理速度。通過使用一個非常簡單的模式和大約 4000 行的表,我獲得了 5% 的執行時間的改善。當然,模式越復雜,差異將越顯著。
我先前提到該實現假定模式在處理期間不會隨行的不同而更改。當然,如果模式確實更改了,您可以進行少量的改寫以再次編譯一個模式。要這樣做,有必要跟蹤當前(已編譯的)模式並在每次調用中將它與所提供的模式進行比較。也可以在高速暫存中維護當前模式。但必須將它復制到獨立的緩沖區,並且不能通過指針模式直接引用它,因為這個指針或它所引用的數據可能會更改或變為無效。至於相應的代碼更改,就當作練習留給讀者了。
返回匹配子串
大多數模式匹配引擎提供了一種方法,返回與指定模式或其一部分相匹配的子串。如果想在 SQL 中使用這種能力,則必須使用不同的方法來實現匹配函數。給定的字元串可能包含不止一個匹配的子串。例如,當解析類似「abc = 123;」或「def = 'some text';」這樣的字元串時,用戶可能會希望檢索由等號分隔的兩個子串。您可以使用模式「\\w+\\s*=\\s*(\\d+|'[\\w\\s] *');」來表示適用於該字元串的語法規則。Perl 兼容的正則表達式允許您捕獲等號兩邊的子串。最後,必須將要捕獲的子串用括弧括起來。我已經用該方式編寫了第二個子串,但第一個子串不是這樣編寫的。用於該用途的最終模式是這樣的:
(\\w+)\\s*=\\s*(\\d+|'[\\w\\s]*');
當把這個模式應用於字元串「abc= 123;」或「def = 'some text';」時,「abc」或「def」分別與「(\\w+)」匹配,空格和等號是通過「\\s*=\\s*」查找的,並用另外的「(\\d+|'[\ \w\\s*]')」涵蓋了餘下的子串。在「(\\d+|'[\\w\\s*]')」中,第一個選項與任何至少由一個數字「\\d+」組成的數匹配,而第二個選項解析任何由字母和空格組成的由單引號括起的字元串「'[\\w\\s]*'」。
在 DB2 中做到這一點的需求可以描述成:為一次 UDF 調用返回多個結果。換句話說,就是返回針對模式進行匹配的單個字元串的多個子串。DB2 的表函數是完成這一任務的完美工具。
實現表 UDF
和以前一樣,必須在資料庫中創建該函數。 清單 8中的下列語句正是用於這一任務的:
清單 8. 注冊名為 regex3 的表 UDF
CREATE FUNCTION regex3(pattern VARCHAR(2048), string CLOB(10M))
RETURNS TABLE ( position INTEGER, substring VARCHAR(2048) )
SPECIFIC regexSubstr
EXTERNAL NAME 'regexUdf!regexpSubstr'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
NOT FENCED
RETURNS NULL ON NULL INPUT
NO SQL
NO EXTERNAL ACTION
SCRATCHPAD 50
NO FINAL CALL
DISALLOW PARALLEL;
實現該函數的實際邏輯的 C 代碼與 清單 7中的代碼非常相似,但根據表函數所必須滿足的特殊需求對它進行了改編,如 清單 9所示
你還是看一下這個網站
http://news.weixiuwang.com/server/2006-6/2006E6Y2;1057E89818855_1.htm
⑶ DB2的SQL腳本如何定義變數,並賦值使用執行成功有重賞哦,謝謝
用存儲過程啊,給你個簡單的例子
CREATE PROCEDURE SPCARDTRACE
(
IN I_CARDNO VARCHAR(10)
)
-- 存儲過程功能 :
-- 創建人:
-- 創建日期:
-- 參數說明:
-- 01. : I_CARDNO 卡號
-- 02. :
-- 03. :
LANGUAGE SQL
SPECIFIC SPCARDTRACE
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
BEGIN
DECLARE V_CARDNO VARCHAR(10); --卡號
DECLARE V_EMPNAME VARCHAR(16); --持卡人
DECLARE V_CARDBALANCE DECIMAL(8,2); --卡余額
DECLARE V_HAPPENDATE INT;--統計時間
DECLARE V_MINTIME TIMESTAMP; --最小時間
DECLARE V_MAXTIME TIMESTAMP; --最大時間
DECLARE V_MINMONTH INT ;
DECLARE V_MAXMONTH INT ;
DECLARE V_ISSUECARDDATE TIMESTAMP; --發卡時間
DECLARE V_SUBSIDYMONEY DECIMAL(8,2);--補貼金額
DECLARE V_CONSUMEMONEY DECIMAL(8,2);--沖值金額
DECLARE V_PUTMONEY DECIMAL(8,2);--沖值金額
DECLARE V_OUTMONEY DECIMAL(8,2);--退款金額
DECLARE V_CHANGEMONEY DECIMAL(8,2);--改卡差額
DECLARE V_STRSQL VARCHAR(1000); --SQL
DECLARE CS CURSOR WITH RETURN TO CALLER FOR RETURNTABLE;
INSERT INTO TBCARDTRACE ( CARDNO,EMPNAME,CARDBALANCE,ISSUECARDDATE ,HAPPENDATE,
SUBSIDYMONEY,PUTMONEY,OUTMONEY ,CONSUMEMONEY,CHANGEMONEY )
VALUES (V_CARDNO,V_EMPNAME,V_CARDBALANCE,V_ISSUECARDDATE,V_HAPPENDATE,
V_SUBSIDYMONEY,V_PUTMONEY,V_OUTMONEY,V_CONSUMEMONEY,V_CHANGEMONEY);
END
⑷ db2 sql 建表參數 cache 20什麼意思
指定是否在內存中保留一些預分配的值,以便更快地訪問.
cache 20 就是緩存20個值保存在內存中
⑸ DB2在連接資料庫時需要設置什麼參數嗎
不需要設置。
客戶端連接的時候需要這個db2的埠,這個默認是50000,也可以通過如下查看:
C:\SQLLIB97\BIN>db2 get dbm cfg | grep SVCENAME
TCP/IP Service name (SVCENAME) = db2c_DB2_01
SSL service name (SSL_SVCENAME) =
得到了服務名稱db2c_DB2_01,然後到系統埠文件去查看對應的埠號:
在windows上這個文件是C:\WINDOWS\system32\drivers\etc\service
Unix和Linux上為: /etc/services
如果該埠沒有設置,可以如下設置:
db2 update dbm cfg using svcename 50000
db2 terminate
⑹ db2cmd怎麼執行sql文件並傳遞參數
查詢管理器里 新建一個連接 在右邊打開的編輯域粘貼執行
或者直接打開.sql文件
⑺ 關於DB2資料庫的參數調優技巧
在開始前 請關閉IBM目錄伺服器 將上下文切換到IBM目錄伺服器DB 實例擁有者 一般是ldapdb 用戶 比如
在Unix系統里 輸入
su ldapdb
在Windows系統里 輸入
db cmdset DB INSTANCE=ldapdb
為了調節DB 參數 運行db tunings sh腳本 你可以在這里下載:// sofare ibm /ibmdl/pub/sofare/tivoli_support/misc/Security/AMeB/_am /tuning_guide_scripts tar
或者通過ftp地址
ftp://ftp sofare ibm /sofare/tivoli_support/misc/Security/AMeB/am /tuning_guide_scripts tar
Web頁面需要注冊用戶名和密碼
這個腳本的文件系統擁有者必須是DB 實例擁有者 一般就是ldapdb 用戶 文件系統組應該和實例擁有者相同(一般是dbsysadm) 腳本必須在DB 實例擁有者的上下文中使用
腳本中的ibmdefaultbp和ldapbp參數控制著DB 的緩沖池 db _turnings sh腳本 設置了DB 緩沖池的建議大小 其他一些可選的設置在腳本的注釋里寫明了 IBM目錄伺服器的性能隨著DB 緩沖池的增長而提高 然而在大多數情況下 通過這樣的參數調節方式 你可以預見不超過 %的性能提高
DB 緩沖池是DB 緩存數據表和索引的地方 DB 用戶使用索引來在查詢時迅速找到該獲取哪個錶行項 需要更多信息 請參考IBM Directory Server Tuning Guide
顯示和驗證當前設置
輸入如下命令來顯示當前的DB 參數調節設置的結果
db get database configuration for ldapdb |
egrep DBHEAP|SORTHEAP|MAXLOCKS|MINMIT|UTIL_HEAP_SZ|APPLHEAPSZ
db connect to ldapdb
db select bpname npages pagesize from syscat bufferpools
db terminate
如果某個堆配置參數過低 就將出現一些功能性的問題 輸入如下命令來顯示當前的堆參數設置
db get db cfg for ldapdb | grep HEAP
下面是一個使用了推薦值的多種堆參數的輸出例子顯示
Database heap ( KB) (DBHEAP) =
Utilities heap size ( KB) (UTIL_HEAP_SZ) =
Max appl control heap size ( KB) (APP_CTL_HEAP_SZ) =
Sort list heap ( KB) (SORTHEAP) =
SQL statement heap ( KB) (STMTHEAP) =
Default application heap ( KB) (APPLHEAPSZ) =
Statistics heap size ( KB ) (STAT_HEAP_SZ) =
如果一個堆參數小於最小值 輸入如下命令將其增大到最小值
db update db cfg for ldapdb using parm_name parm_value
這里parm_name是上文輸出中的第三欄的字樣(無括弧) parm_value是最後一欄的值
如果堆參數設置的過高或者過低 IBM的目錄伺服器都會以失效來提示出現了問題 在這種情況下 需要查看諸如IBM Directory Server V (IDS )的cli error文件或者IBM Tivoli Directory Server V (IDS v )的db cli log或者其他一些文件 在IDS v 系統中 該文件預設目錄在Solaris的/var/ldap/和AIX的/tmp中 在IDS v 和後來系統中 Solaris和AIX的預設目錄都是/var/ldap
注意db look能夠在一條命令下提供關於資料庫及其配置的足夠多的信息 例子如下
db look d ldapdb u ldapdb p o output_file
output_file是存儲結果的文件位置
關於IBM目錄伺服器運行的警告
DB 參數調節使用了db terminate 如果當該命令發出 IBM目錄伺服器slapd或ibmslapd進程在運行 它將阻止伺服器的部分功能 所有緩存的搜索看起來反應正常 其他的搜索將會簡單的變為無結果或者出現錯誤信息 恢復功能將會重啟IBM目錄伺服器 因此最好是在調節DB 參數時關閉IBM目錄伺服器
關於緩沖池內存使用的警告
如果任何的緩沖池被設置過高 DB 將會因為缺少足夠內存而無法啟動 如果出現該問題將會有一個核心轉儲的文件 但是通常沒有錯誤信息
在AIX系統里 系統錯誤日誌將會報告一個內存分配失敗 查看這個日誌請輸入
errpt a | more
使用太大的緩沖池大小來恢復一個被分在系統里的資料庫將會導致恢復失敗 查看//publib boulder ibm /infocenter/tivihelp/v r /topic/ ibm itame doc_ /am _perftune #idtrouble來解決這個問題
如果DB 因為緩沖池過大而無法啟動 請重新調節DB 參數
關於MINMIT的警告
lishixin/Article/program/DB2/201311/11229
⑻ DB2鎖方面的SQL語句分析
鎖表和mc_mer_trad_incom的更新頻率有關系的
可以在mc_payment_flow,mc_payment_flow表上建索引減少mc_mer_trad_incom的鎖表時間
如果有頻繁的mc_payment_flow,mc_payment_flow表的更新操作可以直接使用X鎖避免NS鎖的升級
可以在select中加入with rs use and keep exclusive locks避免鎖升級
資料庫的參數可調整locktimeout,locklist,maxlocks
⑼ 如何在db2命令行運行sql必知必會例子
db2 => connect to dbName user xxx using password
db2 => sql語句
如果要執行一個sql腳本文件:
db2 => quit
c:\> db2 -tvf sql文件名
db2 -td@ -f filename
@是語句結束符。
E:\>db2 ? options
db2 [option ...] [db2-command | sql-statement |
[? [phrase | message | sqlstate | class-code]]]
option:-a、-c、-e{c|s}、-finfile、-lhistfile、-n、-o、-p、-rreport、-s、-t、
-td;、-v、-w、-x 和 -zoutputfile。
選項 描述 預設設置
------ ---------------------------------------- ---------------
-a 顯示 SQLCA OFF
-c 自動落實 ON
-e 顯示 SQLCODE/SQLSTATE OFF
-f 讀取輸入文件 OFF
-l 將命令記錄到歷史文件中 OFF
-n 除去換行字元 OFF
-o 顯示輸出 ON
-p 顯示 db2 互動式提示符 ON
-r 將輸出報告保存到文件 OFF
-s 在命令出錯時停止執行 OFF
-t 設置語句終止字元 OFF
-v 回送當前命令 OFF
-w 顯示 FETCH/SELECT 警告消息 ON
-x 不列印列標題 OFF
-z 將所有輸出保存到輸出文件 OFF
注意:
使用 DB2OPTIONS 環境變數定製選項預設值。
緊跟選項字母後的減號(-)使該選項關閉。
使用 UPDATE COMMAND OPTIONS 更改選項設置(以互動式或
文件輸入方式)。
只能提供nt環境下編寫腳本的例子給你以供參考:
腳本樣例:
db2 connect to yourdb user yourname using yourpassword
db2 insert into newuser(username,password,email) values('Amy','1234','[email protected]')
db2 insert into newuser(username,password,email) values('Judy','1234','[email protected]')
db2 commit
db2 disconnect yourdb
運行腳本: 運行db2cmd X:\XXX.bat
以下摘自本論壇的FAQ可參考:
"
在命令窗口中運行DB2腳本,可用 db2 -svtf 腳本文件名 來實現。
例如,腳本文件名為sample.sql,運行:db2 -svtf sample.sql
參數中:
s 代表遇到錯誤時中止運行腳本
v 代表輸出結果到屏幕
t 指以;號作為每行的分隔符
f 指後面需跟腳本文件名 "---此摘錄版權歸斑竹非本人所有
具體在AS400如何編寫腳本非常遺憾.
db2 -x select SERIALNO from tabname where clause
C:>db2 attach to db2164 user ccp
輸入 ccp 的當前密碼:
實例連接信息
實例伺服器 = DB2/NT 8.2.0
授權標識 = CCP
本地實例別名 = DB2164
C:>db2 connect to dw164 user ccp
輸入 ccp 的當前密碼:
資料庫連接信息
資料庫伺服器 = DB2/NT 8.2.0
SQL 授權標識 = CCP
本地資料庫別名 = DW164
C:>db2 select * from CCP_STS1 fetch first 2 rows only with ur
CUST_ID NOW_PRED_S LOAD_TIME
-------------------- -------------------- --------------------------
3094736. ZFS 2008-05-07-10.02.00.453000
3145886. ZFS 2008-05-07-10.02.00.453000
2 條記錄已選擇。
C:>db2 list command options
命令行處理器選項設置
後端進程等待時間(秒) (DB2BQTIME) = 1
連接至後端的重試次數 (DB2BQTRY) = 60
請求隊列等待時間(秒) (DB2RQTIME) = 5
輸入隊列等待時間(秒) (DB2IQTIME) = 5
命令選項 (DB2OPTIONS) = +m
選項 描述 當前設置
------ ---------------------------------------- ---------------
-a 顯示 SQLCA OFF
-c 自動落實 ON
-d 檢索並顯示 XML 聲明 OFF
-e 顯示 SQLCODE/SQLSTATE OFF
-f 讀取輸入文件 OFF
-i 顯示 XML 數據並帶有縮進 OFF
-l 將命令記錄到歷史記錄文件中 OFF
-m 顯示受影響的行數 OFF
-n 除去換行字元 OFF
-o 顯示輸出 ON
-p 顯示互動式輸入提示符 ON
-q 保留空格和換行符 OFF
-r 將輸出保存到報告文件 OFF
-s 在命令出錯時停止執行 OFF
-t 設置語句終止字元 OFF
-v 回傳當前命令 OFF
-w 顯示 FETCH/SELECT 警告消息 ON
-x 不列印列標題 OFF
-z 將所有輸出保存到輸出文件 OFF
C:>db2set DB2OPTIONS=-x
C:>db2 select * from CCP_STS1 fetch first 2 rows only with ur
4654908. ZFS 2008-05-07-10.02.00.453000
3716687. ZFS 2008-05-07-10.02.00.453000
⑽ 請問如何給DB2資料庫的存儲過程中 where 的in 條件傳參數
create
or
replace
procere
test(in
in_where
varchar(100))
--創建一個
存儲過程
test,並可以傳入字元串作為參數
declare
v_sql
varchar(512);
set
v_sql
=
'
delete
from
table1
where
field1
in
('
concat
in_where
concat
')
'
;
--
這里是把傳進來的where語句拼起來
execute
immediate
v_sql;
--這里是把語句進行執行
------
---類似以上這樣的存儲過程,使用以下的放在進行執行即可:call
test(
'
''001'',''002''
')
;
--內容中的一個『
需要使用
』『
進行
轉義