我需要将函数签名更改为具有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的新手,感谢您的帮助。
答案 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。