PL / SQL:varchar2作为IN参数,无法正常工作

时间:2017-06-09 19:33:23

标签: oracle plsql

我有一个像这样的PL / SQL函数:

FUNCTION find_by_items(items IN varchar2)
RETURN SYS_REFCURSOR
AS
  o_cursor SYS_REFCURSOR;
BEGIN
  open o_cursor for select a.something from my_table a where a.item in (items);
  return o_cursor;
END find_by_items;

这总是返回一个空光标。

如果我运行它,例如:

select find_by_items('''one'', ''two'', ''three''');

我得到一个空光标。

如果我将sql语句放在字符串中并修改函数,如:

FUNCTION find_by_items(items IN varchar2)
RETURN SYS_REFCURSOR
AS
  o_cursor SYS_REFCURSOR;
  strSql varchar2(32767);
BEGIN
  strSql := 'select a.something from my_table a where a.item in (' || items || ')';
  open o_cursor for strSql;
  return o_cursor;
END find_by_items;

我以完全相同的方式调用该函数:

select find_by_items('''one'', ''two'', ''three''');

我得到了我期望的结果(不是空光标)

-

基本上我正在试图弄清楚如何使第一种方式起作用,因为使用字符串意味着它更容易出现运行时错误而不是编译错误 - 在我的特定情况下这是不可取的。

谢谢

1 个答案:

答案 0 :(得分:0)

第一个实现永远不会像您期望的那样工作,因为Oracle按如下方式解析Query:

select a.something from my_table a where a.item in ('''one'', ''two'', ''three''')

以及你想要的是什么

 select a.something from my_table a where a.item in ('one', 'two','three')

将您的字符串参数值拆分并存储到varray中,以便您可以使用以下格式:

 select a.something from my_table a where a.item in (table(varray_var));