2006-12-11

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

来源: 本站收集整理 作者:佚名 评论 0 条
 

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

  );
  

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


(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:想进Google,先来做做Google招聘题  
下一篇:用PHP发送有附件的电子邮件
    评论加载中…
  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
共2页: 上一页 1 [2] 下一页
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号