當前位置:首頁 » 編程語言 » db2sqlin

db2sqlin

發布時間: 2022-07-19 20:58:15

A. 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

B. DB2開發上 SQL語句的問題

SELECT BDF_BSNCODE,STT FROM CB_BSNDEF LEFT OUTER JOIN ( SELECT CBB_BSNCODE,'1' AS STT FROM CB_CST_BSN_BANNED WHERE CBB_CSTNO='1000000000' ) as table1 ON BDF_BSNCODE = table1.CBB_BSNCODE WHERE BDF_TYPE IN ('2','4','6') ORDER BY BDF_BSNCODE
如果想將查詢的結果當成一張臨時表查詢的話一定要給他起個名字

C. 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

D. 請問如何給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''
')
;
--內容中的一個『
需要使用
』『
進行
轉義

E. DB2 SQL語句問題

select top 5 a.id,a.name,a.price from proct a where a.id
not in(select top 2 b.id from proct b order by b.price desc)
order by a.price desc

F. db2中sql語句問題

因為replace('01,02,03','''','')最後得到的還是一個字元串
原來是 where 機構 in ('『』01,02,03'『』)

現在變成了 where 機構 in (』01,02,03')

可以把要執行的 SQL語句 賦值一個字元串變數中,然後運行字元串
如:
DECLARE sql VARCHAR(255);
SET sql = 'SELECT field INTO V_A FROM ' || tablename;
PREPARE s1 FROM sql;
EXECUTE s1;

G. 求助db2如何執行動態SQL 並返回值

大多數情況下,DB2資料庫管理程序在需要鎖時會隱式地獲取它們,事務不需要顯式地請求鎖,唯一有可能被事務顯式鎖定的資料庫對象就是表,可以使用下邊的語句。\r\nALTER TABLE [TableName] LOCKSIZE TABLE\r\n或\r\nLOCK TABLE [TableName] IN [SHARE|EXCLUSIVE] MODE

H. 如何給DB2資料庫的存儲過程中 where 的in 條件傳參數

WITH RETURN TO CALLER DECLARE CHOICE2游標 - 聲明游標Choice2
SELECT CompanyID,DEPTID,SEQ ID SUBMITTIME,
B.GRADEDESC HYEAR,產品編號,產品代碼PRODUCTDESC

A.GRADEID,價格,SFZDPY,的LQUANT,MQUANT,MCQUANT,LCQUANT,

UQUANT OTHQUANT1 OTHQUANT2 OTHQUANT3 OTHQUANT4,EMP1 EMP2狀態,A.REMARK:

十進制(ABS(MCQUANT,
NULLIF(MQUANT,0)* 100,10,2)標簽/>從T_SUPPLY_PPB_HYà

LEFT JOIN B開A.GRADEID的T_SUPPLY_GRADATION的B.GRADEID

,WHERE HYEAR = TO_CHAR(P_NF )| | P_BN

訂單由B.GRADEID PRODUCTCODE,A.PRICE;

- 1.DECIMAL(P,S)十進制數,小數點位置精度(P)和確定的小數位數(S)。 /> - 精度的號碼的數字之和的總數必須小於32。小數位的數字位數的小數部分總是小於或等於精度。

- 如果你不指定精度和小數位數,默認精度的十進制值是5,和默認的小數位數為0。

- 2語法:NULLIF(表達式,表達式)

- 表達式:(常量,列名,函數,子查詢或算術運算符,任何按位運算符和字元串運算組)
- 如果兩個表達式不相等,NULLIF返回第一個表達式的值。如果他們是平等的,NULLIF返回第一個表達式類型的空值。如果兩個表達式都是平等的,表達式的結果是NULL,NULLIF相當於CASE的搜索功能。

I. 如何給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''
')
;
--內容中的一個『
需要使用
』『
進行轉義

J. 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

熱點內容
scratch編程網站 發布:2025-02-01 05:51:27 瀏覽:395
安卓怎麼更好用 發布:2025-02-01 05:45:38 瀏覽:146
ps如何存儲多頁為pdf 發布:2025-02-01 05:44:15 瀏覽:32
預編譯和預處理區別 發布:2025-02-01 05:30:42 瀏覽:965
怎麼改變網路伺服器 發布:2025-02-01 05:24:55 瀏覽:602
華為雲伺服器可以裝軟體嗎 發布:2025-02-01 05:20:29 瀏覽:346
為什麼ios比安卓穩定 發布:2025-02-01 05:17:15 瀏覽:668
農村社保卡密碼多少 發布:2025-02-01 05:17:05 瀏覽:745
android下拉刷新通用 發布:2025-02-01 05:03:51 瀏覽:906
紫光存儲最近 發布:2025-02-01 04:58:49 瀏覽:381