2015-04-03 145 views
0

我正在嘗試在Oracle中編寫一個存儲過程,其中我將字符串值in_ myString的值('xxx','yyy')作爲Varchar並返回一個遊標。我的過程如下所示:如何將作爲字符串參數傳遞的逗號分隔值傳遞給Oracle存儲過程?

create or relace getName(in_myString in varchar, Name_list out refcursor) IS 

Begin 

Open cursor for 
Select Colunm1 from table where coulunmName in (in_MyString); 

但是沒有返回任何記錄,但我試圖單獨運行查詢它正在返回記錄。請任何人都可以幫我嗎?

+0

IN子句採用值列表。你傳遞一個字符串,它會逐字比較'coulunmName' [sic]和'in_myString'中的值。假設Oracle支持所有這些,您將需要動態SQL和適當地分割字符串來做更多或更少的事情。我不知道Oracle的標準解決方法是什麼。在其他DBMS中,一種技術是將值列表加載到臨時表中,並在該表與生產表之間進行連接以選擇值。在Oracle中可能有其他方法來完成它。 – 2015-04-03 03:37:31

+0

光標看起來不錯,你是否以適當的格式傳遞'in_myString'變量?你如何檢查沒有行被返回? – Lokesh 2015-04-03 03:37:53

+0

@lokesh我不確定這種類型的參數在Oracle中應該是什麼格式,但是當我傳入in_myString的值(xxx)時,它會返回一條記錄,但是當我將in_myString的值傳遞給(xxx,yyy )這是逗號分隔它不會返回任何東西 – user970500 2015-04-03 03:43:08

回答

1

假設你的參數輸入值是這樣的in_myString:='xxx,yyy';我們可以使用SQL正則表達式函數根據逗號分割值,並將結果列表傳遞給IN子句。

create or relace getName(in_myString in varchar, Name_list out refcursor)  IS 

    Begin 

Open cursor for 
     Select Colunm1 from table where coulunmName in 
      (select regexp_substr(in_myString,'[^,]+', 1, level) from dual 
      connect by regexp_substr(in_myString, '[^,]+', 1, level) is not null); 

有關正則表達式的更多信息,請參見here

+0

我試過這個,但似乎regexp_substr不在Oracle中,因爲它說無效標識符。 – user970500 2015-04-03 04:30:07

+0

在Oracle中引入10g版本的正則表達式函數。有關更多信息,請參閱鏈接http://oracle-base.com/articles/misc/regular-expressions-support-in-oracle.php – thots 2015-04-03 05:02:41

相關問題