我需要更改函数签名以具有 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: expression is of wrong type
我是 PL/SQL 的新手,感谢您的帮助。
最佳答案
只要您必须修改此特定代码片段以使用 DBMS_SQL,我就会强烈考虑更改它以完全消除动态 SQL 方法。相反,我会选择汤姆的 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 注入(inject)攻击等风险。
关于sql - 在 PL/SQL 中连接 CLOB 以立即执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403371/