2015-04-03 147 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

相关问题