分享
 
 
 

如何正确的在对in操作使用变量绑定

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

家都知道在sql语句中变量绑定的重大意义,甚至有高人指出:一个应用想要它变的很糟糙的话,只要不使用变量绑定就可以了。这话的确不假。这时可能有人就会问:我该绑定的都绑定了,可是我实在无法想到好的方法在in操作符中使用变量绑定。下面的方法可以解决这个疑问。

我们知道in操作符接受两种list, 一个是由一个个item组成的list,

另一个是由另一个表中选出的list。第一种方式由于值个数不一定,变量绑定具有一定的困难。于是我们思路就集中到准备将一个字符串传入到sql语句中,然后使用一个方法将字符串parse成一个table, 再传回in operator:

首先我们来创建方法,及由此方法返回的table类型:

rudolf@test9i create or replace type numTableType as table

2

of number

3

/

Type created.

rudolf@test9i create or replace function str2numList( p_string in varchar2 ) return

2

numTableType

3

as

4

v_str

long default p_string || ',';

5

v_n

number;

6

v_data

numTableType := numTableType();

7

begin

8

loop

9

v_n := to_number(instr( v_str, ',' ));

10

exit when (nvl(v_n,0) = 0);

11

v_data.extend;

12

v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));

13

v_str := substr( v_str, v_n+1 );

14

end loop;

15

return v_data;

16

end;

17

/

Function created.

我们把下列语句:

select object_name from t where object_id in ( xx,xxx,xxx,...);

改为:

select object_name from t

where object_id in

( select * from

THE ( select cast( str2numList(:variable ) as numtableType ) from

dual )

);

现在我们来看看是否达到了我们的目的:

rudolf@test9i var STR varchar2(3000)

rudolf@test9i

exec :STR := '5770,1810,4481'

PL/SQL procedure successfully completed.

rudolf@test9i alter session set events= '10046 trace name context forever, level 4'

2

/

Session altered.

rudolf@test9i select object_id,object_name from t where object_id in (

2

select * from

THE ( select cast( str2numList(:STR ) as numtableType ) from

3

dual ) )

4

rudolf@test9i /

OBJECT_ID OBJECT_NAME

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

1810 ALL_ALL_TABLES

4481 AGGXMLINPUTTYPE

5770 ALL_APPLY

检查dump文件,我们看到(注意星号的行):

PARSING IN CURSOR #1 len=146 dep=0 uid=81 oct=3 lid=81 tim=1036636837633718 hv=2833917919 ad='529b9f48'

select object_id,object_name from t where object_id in (

select * from

THE ( select cast( str2numList(:STR ) as numtableType ) from

dual ) )

END OF STMT

PARSE #1:c=0,e=655,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=0,tim=1036636837633701

BINDS #1:

*****

bind 0: dty=1 mxl=2000(200) mal=00 scl=00 pre=00 oacflg=03 oacfl2=10 size=2000 offset=0

bfp=406402fc bln=2000 avl=14 flg=05

value="5770,1810,4481"

EXEC #1:c=0,e=245,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=1036636837645450

FETCH #1:c=20000,e=16739,p=0,cr=52,cu=0,mis=0,r=1,dep=0,og=4,tim=1036636837662283

FETCH #1:c=0,e=4644,p=0,cr=0,cu=0,mis=0,r=2,dep=0,og=4,tim=1036636837667979

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有