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

用于立即执行的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

我需要更改一个函数签名,使其具有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新手,谢谢您的帮助。

在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有那么长的时间。我完全怀疑这个方法。是的,我完全同意你的看法。我正在维护一些代码,希望避免重写整个代码。