国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

如何正確的在對in操作使用變量綁定

2024-07-21 02:38:57
字體:
來源:轉載
供稿:網友

  家都知道在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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 从江县| 平武县| 辰溪县| 嘉善县| 通许县| 林甸县| 夏河县| 五峰| 右玉县| 黑河市| 罗平县| 四会市| 轮台县| 九寨沟县| 汝阳县| 三亚市| 海口市| 永新县| 崇义县| 平山县| 宜州市| 晴隆县| 台江县| 阿荣旗| 杭锦后旗| 汉阴县| 永年县| 横山县| 华安县| 吕梁市| 呼玛县| 六盘水市| 东光县| 汝阳县| 宁津县| 顺平县| 三江| 和平区| 旬邑县| 哈尔滨市| 普兰店市|