2013-07-27 30 views
0

我將以逗號分隔的參數值發送到Oracle中的存儲過程。參數都到了WHERE條款,我想實現這樣的事情:以逗號分隔的值發送到Oracle存儲過程中的WHERE子句

valuestring = "ABC123, ABC456, ABC789" 



SELECT * 
    FROM Tbl1 
    WHERE column IN (valuestring) 

問題是SELECT語句不識別的值之間的逗號,它把它作爲一個字符串,所以當存儲過程被執行,它不返回任何值。

任何幫助,將不勝感激。

+0

您是否考慮過動態查詢?或者,也許這將有助於http://stackoverflow.com/questions/242771/oracle-stored-procedure-with-parameters-for-in-clause?rq=1 – unlimit

+0

這是我想到的下一個方法 – user1783490

回答

1

理想情況下,不是傳遞由逗號分隔值組成的單個字符串,而是傳入一個集合。如果您有類似

CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10); 

,那麼你可以通過該集合到你的程序,並用它在WHERE條款

CREATE OR REPLACE PROCEDURE procedure_name(p_values IN value_tbl) 
AS 
    ... 
BEGIN 
    FOR i IN (SELECT * 
       FROM table_name 
      WHERE column_name IN (SELECT * 
            FROM TABLE(p_values))) 
    LOOP 
    ... 
    END LOOP; 
END; 

如果你真的需要在一個逗號分隔的字符串來傳遞,可以定義相同的集合類型,然後使用類似Tom Kyte's str2tbl function的字符串解析字符串以填充集合。但是,這比傳入一個集合的效率要低。

+0

必須有成爲這個問題經常出現的原因。如果前端是VB.net大概它不是一個傳統的應用程序。也許現代開發人員只學習如何連接值,而不會懷疑是否有更好的方法來處理多個值? – APC

0

可以像下面給出的方式傳遞您的值字符串。這將轉換整個逗號分隔的字符串在不同的行,因此將很容易使用的地方,你想要的。

SELECT trim(x.column_value.extract('e/text()')) COLUMNS 
from t t, table (xmlsequence(xmltype('<e><e>' || replace(valuestring,':','</e><e>')|| 
'</e></e>').extract('e/e'))) x );