2015-10-09 21 views
3

我會給你兩段我正在使用的SQL腳本的代碼,但它們就足夠了。 首先,我聲明一個變量:如何在NOT IN子句中使用字符串作爲變量?

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天的時間...

提前致謝!

+2

[多個值的宣言中的Oracle綁定變量(可能的重複http://stackoverflow.com/questions/6632741/declaration- -oracle-bind-variables) – sstan

+2

我想你可以在這裏找到答案 - https://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: p11_question_id:210612357425 – Tatiana

+0

建議的重複問題涉及通過綁定變量獲取列表,在這種情況下,它是PL/SQL中的一個靜態列表,它使用戶定義的類型更加實用。 – Allan

回答

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)) 

你應該注意到,類型必須作爲一個數據庫對象,包內沒有申報創建。

+0

似乎很好,但我得到'錯誤(240,34):PLS-00642:SQL語句中不允許使用本地集合類型... ... – dziki

+0

必須將該類型創建爲數據庫對象才能在SQL中使用。這意味着它必須有自己的「創建或替換」,而不僅僅是在PL/SQL中聲明。如果您可以在ALL_TYPES中看到該類型,那麼它是以正確的方式創建的。 – Allan

0

選項A - 使用像

你可以做一個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行,這樣就完成了。你真的需要能夠測試,兩天時間太長。

0

可以使用REGEXP_LIKE函數來模擬條款:

WHERE NOT REGEXP_LIKE(l_tables_excl, '(^|,)'||cos.table_name||'(,|$)') 
相關問題