sql - 在 PL/SQL 中连接 CLOB 以立即执行

标签 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: 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/

相关文章:

sql - 如何将这些列转换/转置为 SQL 中的行?

java - Oracle 11g 和数据库连接

mysql - 比较具有相同 ID 的行的日期时间,只返回日期时间差小于 4 小时的列

php - 从mysql中的列中获取数据

sql - 可变数据库名称

java - java程序调用postgresql数据库的函数

sql - 将数据移动到数据仓库的正确方法

java - 使用 BasicDataSource 的 MYSQL 事务

php - sql 中的最大值到最小值排序无法正常工作

sql - SQL命令在动态sql查询oracle中未正确结束?