用于立即执行的PL/SQL中的Concat CLOB
我需要更改一个函数签名,使其具有CLOB类型的参数(p_param),之前的类型是nvarchar2。这在现有代码使用| |进行编码时给我带来了麻烦 这里是现有的代码片段,它对NVarchar2很有效,但显然,当您使用| |来处理CLOB时,它会将其视为NVarchar2,这在超过NVarchar2的字符限制时是一个问题用于立即执行的PL/SQL中的Concat CLOB,sql,database,oracle,plsql,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
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新手,谢谢您的帮助。在11g之前,您不能使用CLOB执行立即命令。在此之前,您需要切换到DBMS_SQL
在11g之前,不能将CLOB用于立即执行。在此之前,您需要切换到DBMS_SQL
< p>只要你必须修改这个特定的代码片段来使用dbMSySQL,我会强烈地考虑改变它以完全消除动态SQL方法。相反,我将使用Tom的函数,将其修改为使用CLOB(后续的回复已完成),然后将代码更改为
select p.person_id
bulk collect into persons
from person p
where p.id in (select column_value
from str2tbl( p_param ))
至少,这将使您避免创建大量不可共享的语句,减少硬解析的数量和解析所花费的时间,并减少共享池的压力。它也可以减少SQL注入攻击之类的风险。< P>只要你必须修改这个特定的代码片段来使用DbMSYSQL,我会强烈地考虑改变它以完全消除动态SQL方法。相反,我将使用Tom的函数,将其修改为使用CLOB(后续的回复已完成),然后将代码更改为
select p.person_id
bulk collect into persons
from person p
where p.id in (select column_value
from str2tbl( p_param ))
至少,这将使您避免创建大量不可共享的语句,减少硬解析的数量和解析所花费的时间,并减少共享池的压力。它还可以降低SQL注入攻击之类的风险。您是否建立了一个太长的人员列表,以至于无法放入VARCHAR2或NVARCHAR2变量?我认为Oracle不喜欢SQL有那么长的时间。我完全怀疑这个方法。是的,我完全同意你的看法。我正在维护一些代码,并且希望避免重写整个代码。您是否正在构建一个太长的人员列表,以至于无法放入VARCHAR2或NVARCHAR2变量?我认为Oracle不喜欢SQL有那么长的时间。我完全怀疑这个方法。是的,我完全同意你的看法。我正在维护一些代码,希望避免重写整个代码。