如何在NOT IN子句中使用字符串作为变量?

时间:2015-10-09 14:08:33

标签: oracle plsql

我将从我正在使用的SQL脚本中给你两片代码,但它们就足够了。 首先,我宣布一个变量:

FUNCTION Run
( i_PlafId  IN INTEGER
)
RETURN INTEGER
IS

l_tables_excl VARCHAR2(256) := 'TABLE_1,TABLE_2';

后来我想在某个地方使用它,比如:

AND cos.table_name NOT IN l_tables_excl

这将是:

的确切表示
AND cos.table_name NOT IN ('TABLE_1', 'TABLE_2')

无法进行实验,导致此Oracle程序包运行大约需要2天......

提前致谢!

3 个答案:

答案 0 :(得分:3)

处理这样的值列表的最佳方法是使用数组:

create or replace type t_table_list as table of varchar2(50);

FUNCTION Run
( i_PlafId  IN INTEGER
)
RETURN INTEGER
IS

l_tables_excl t_table_list := t_table_list('TABLE_1','TABLE_2');
...
AND cos.table_name NOT IN (select * from table(l_tables_excl))

您应该注意,必须将类型创建为数据库对象,而不是在包中声明。

答案 1 :(得分:0)

选项A - 使用LIKE

您可以执行LIKE查看表名是否在字符串中。这是否有效将取决于您的表名的相似程度。

/* Returns true if table name isn't a substring of l_tables.excl */
AND l_tables_excl NOT LIKE '%' || cos.table_name || '%'

选项B - 将字符串拆分为表格

或者您可以将字符串拆分为表格,然后您就可以使用NOT IN。这有点困难,所以我只给你参考:

测试说明:如果运行您的软件包需要两天时间,您可能希望找到一种只执行部分工作的方法。就像它处理1000行一样,添加一个变量来告诉它只做100行就可以完成。你真的需要能够测试,两天太长了。

答案 2 :(得分:0)

您可以使用REGEXP_LIKE函数来模拟in子句:

WHERE NOT REGEXP_LIKE(l_tables_excl, '(^|,)'||cos.table_name||'(,|$)')