PL / SQL中的Concat CLOB用于执行立即数

时间:2010-12-09 21:36:53

标签: sql database oracle plsql

我需要将函数签名更改为具有CLOB类型的参数(p_param),之前的类型是nvarchar2。当现有代码使用||时,这会给我带来麻烦结束。

这是现有的代码片段,对NVarchar2工作得很好,但显然当你使用||时连接CLOB它会像nvarchar2一样对待它,当超过nvarchar2的字符限制时这是一个问题。

 execute immediate    
    'select p.person_id 
     from person p where p.id in (' || p_param || ')'
 bulk collect into persons;

我尝试将上面的代码更改为

  execute immediate   
   concat(concat('select p.id from person p where p.person_id in(',p_param),')')
  bulk collect into members;

这不编译,我收到错误,

  

PLS-00382:表达式类型错误

我是PL / SQL的新手,感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

只要您必须修改此特定代码片段以使用DBMS_SQL,我会强烈考虑将其更改为完全消除动态SQL方法。相反,我会采用Tom的str2tbl函数,修改它以获取CLOB(后续回复有already done this),然后将代码更改为

select p.person_id 
  bulk collect into persons
  from person p 
 where p.id in (select column_value
                  from str2tbl( p_param ))

至少,这将使您避免创建大量不可共享的语句,减少硬解析的数量和解析所花费的时间,并减少共享池的压力。它还可以降低SQL注入攻击等风险。

答案 1 :(得分:1)

直到11g才能使用CLOB进行EXECUTE IMMEDIATE。在此之前,您需要切换到DBMS_SQL。

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7032414607769#2445120800346017454