db2sqlif
easy ,把if換成 OR .
<if test="carLine != ''">
AND XXMODL LIKE '${carLine}%'
</if>
變成 OR (carLine != '' and XXMODL like '${carLine}%' )
Ⅱ .如何用.bat調用db2資料庫的多個sql文件
@ECHO off
@title Hr資料庫部門、人員信息同步
SET user=hrmis
SET password=hrmis
SET serverip=192.168.0.110
SET db=HRDBG
ECHO ......當前使用的資料庫連接:伺服器ip:%serverip% 資料庫:%db% 用戶名:%user% 密碼: %password%
ECHO ......請確認資料庫連接設置正確,如果不正確請點窗口右上角×退出!!!!!!!
pause
set t0=%TIME:~0,1%
set logTIME=_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
if "%t0%"==" " set logTIME=_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_0%TIME:~1,1%%TIME:~3,2%%TIME:~6,2%
set logfile0=Mas%logTIME%.log
ECHO ......腳本程序開始運行時間:[%DATE:~0,10% %TIME:~0,8%]
ECHO ......腳本程序開始運行時間:[%DATE:~0,10% %TIME:~0,8%] >> %logfile0%
ECHO ......當前使用的資料庫連接:伺服器IP:%serverip% 資料庫:%db% 用戶名:%user% 密碼: %password% >>%logfile0%
ECHO .............updatesql\1、部門、人員信息同步.sql
ECHO .............updatesql\1、部門、人員信息同步.sql>>%logfile0%
osql -U %user% -P %password% -S %serverip% -d %db% -i updatesql\1、部門、人員信息同步.sql>>%logfile0% -n
ECHO .............updatesql\2、考勤數據導入.sql
ECHO .............updatesql\2、考勤數據導入.sql>>%logfile0%
osql -U %user% -P %password% -S %serverip% -d %db% -i updatesql\2、考勤數據導入.sql>>%logfile0% -n
ECHO .............updatesql\3、加班重新計算.sql
ECHO .............updatesql\3、加班重新計算.sql>>%logfile0%
osql -U %user% -P %password% -S %serverip% -d %db% -i updatesql\3、加班重新計算.sql>>%logfile0% -n
ECHO [%DATE:~0,10% %TIME:~0,8%]處理成功!退出系統重新登陸,獲取最終結果。。。。。。
ECHO [%DATE:~0,10% %TIME:~0,8%]完成。 >> %logfile0%
pause
以上是BAT示範文件,保存為BAT格式打開
Ⅲ db2如何把數據導出成sql語句
你的意思是將數據記錄轉換成一條條的 insert 語句?
db2 是沒有這樣的功能的。需要自己開發。
但貌似可以通過自定義存儲過程的方式來實現。這也算是個思路吧。之前google到國外有人通過存儲過程實現了,並有常式,但當時由於版本問題,本人沒有實現。
Ⅳ 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
Ⅳ .請問在SQl語句中實現IF-THEN-ELSE結構 sqlserver可以不,oracle中是怎麼實現的,還有DB2 以及mysql中分
我覺得你要的是 case when then when then else end 方法, 樓上說的都不對
如
case sex when 『1』 then 『男' when '2' then '女' else '其他' end-----簡單case函數
case when sex=1 then『男' when sex=2 then 『女' else 『其他' end --------case搜索函數
你就知道這2種方式 是一回事, 就是一個條件 處理
Ⅵ db2 報SQLSTATE=08001 是什麼原因
這種問題一般的原因:
1.DB2COMM=TCPIP
2.資料庫故障
3.埠號被禁用
解決方案:
1.看看埠號有沒有配置正確,看一下配置參數svcename跟services文件中配置的db2埠號是否一致,windows一般用50000,unix/linux一般用60000。
2.連接出錯首先看看伺服器ip 和埠寫對沒有。
ip如果沒錯就要看看伺服器的db2服務埠對不對。另外對於伺服器下面這些也要注意。
檢查伺服器的配置情況如下:
驗證存在的DB2資料庫
db2 list db directory
db2 list db directory show detail
驗證實例使用的通訊協議,查看DB2COMM變數
db2set -all
查看資料庫管理器的配置,查看SVCENAME(特指tcpip協議)
db2 get dbm cfg
查看/etc/services中,有無與上面對應SVCENAME的埠,例如:
db2cDB2 50000/tcp
要確認伺服器是否在監聽,可以用netstat -an 來查看埠是否處於LISTEN狀態。
Ⅶ LINUX下shell腳本如何執行 sql腳本 到DB2資料庫
1、在gedit中編寫.sh格式的文件,保存為a.sh。
Ⅷ DB2 SQL PROCEDURE 中SIGNAL和RESIGNAL的含義和用法
可以通過SIGNAL和RESIGNAL來顯示的觸發一個指定的SQLSTATE.使用SIGNAL和RESIGNAL的MESSAGE_TEXT來設定伴隨SQLSTATE的文本信息(可以理解為錯誤信息)。
在下面的例子中,在SQL procere定義了一個處理自定義SQLSTATE 72822的條件處理器(condition handler)。當執行SIGNAL 72822語句時,DB2調用條件處理器(Condition Handler),該條件處理器首先通過IF語句測試變數var,如果var等於OK,處理器重新定義SQLSTATE為72623,並且指定了一個text,如果var不等於OK時,處理器重新定義SQLSTATE為72319,同時指定一個text。
DECLARE EXIT HANDLER FOR SQLSTATE '72822' BEGIN IF ( var = 'OK' ) RESIGNAL SQLSTATE '72623' SET MESSAGE_TEXT = 'Got SQLSTATE 72822'; ELSE
RESIGNAL SQLSTATE '72319'
SET MESSAGE_TEXT = var;
END;
SIGNAL SQLSTATE '72822';
Ⅸ db2中怎麼根據條件執行sql
不能這樣執行,只能將這些語句加到存儲過程當中,但存儲過程的語句是有限制的,例如上面的drop table 就不能運行。