当前位置:首页 » 编程语言 » 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

热点内容
合资汽车配置有什么 发布:2025-02-01 02:56:07 浏览:76
wifi共享精灵源码 发布:2025-02-01 02:40:15 浏览:971
java软件怎么安装 发布:2025-02-01 02:40:09 浏览:547
河北税务局电子密码是什么 发布:2025-02-01 02:40:07 浏览:832
检查服务器设置是什么意思 发布:2025-02-01 02:31:26 浏览:183
神偷四第四章密码是多少 发布:2025-02-01 02:07:29 浏览:12
qq登录在哪个文件夹 发布:2025-02-01 01:57:59 浏览:624
如何加入安卓代理 发布:2025-02-01 01:51:40 浏览:3
我的世界手游服务器刷钻石教程 发布:2025-02-01 01:48:13 浏览:774
sqlifthen男女 发布:2025-02-01 01:44:59 浏览:691