我将从我正在使用的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天......
提前致谢!
答案 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||'(,|$)')