for循环内部的游标oracle

时间:2016-01-27 00:49:02

标签: oracle stored-procedures cursor

我创建了一个TYPE

TYPE t_array IS TABLE OF VARCHAR2(15);

一个函数,它接受包含','的字符串。作为分隔符,函数返回t_array,它基本上是拆分字符串并返回值列表。

FUNCTION split_string(id IN VARCHAR2)
...
...
....
RETURN t_array;
END split_string;

现在我的存储过程接受长字符串作为输入,调用函数来拆分字符串并循环遍历t_array并返回CURSOR。

PROCEDURE p_get_xxx(p_id IN VARCHAR2,
                    p_cur_result OUT SYSREFCURSOR)
AS
  l_array schema_name.t_array;
BEGIN
  l_array := split_string(p_id);

  OPEN p_cur_result FOR

  FOR i IN l_array.first .. l_array.last
  LOOP
    SELECT * FROM ........
    WHERE ID = l_array(i);   
  END LOOP;
END p_get_xxx;

我得到了一个编译错误:

  

意外' FOR'代替'('

有没有更好的方法来处理这种情况,或者我在这里遗漏了一些东西?

1 个答案:

答案 0 :(得分:0)

始终在SELECT语句上打开游标。据我所知,没有办法在FOR循环上打开游标。

在我看来,你真的想要动态创建一个SELECT语句。我建议如下:

PROCEDURE p_get_xxx(p_id IN VARCHAR2, p_cur_result OUT SYSREFCURSOR)
AS
  l_array schema_name.t_array;
  strSelect_statement  VARCHAR2(4000);
BEGIN
  l_array := split_string(p_id);

  -- Set up the basics of the SELECT statement

  strSelect_statement := 'SELECT * FROM SOME_TABLE WHERE ID IN (';

  FOR i IN l_array.FIRST..l_array.LAST LOOP
    strSelect_statement := strSelect_statement ||
                             '''' || l_array(i) || ''',';
  END LOOP;

  -- Get rid of the unwanted trailing comma

  strSelect_statement := SUBSTR(strSelect_statement, 1,
                                  LENGTH(strSelect_statement)-1);

  -- Add a right parentheses to close the IN list

  strSelect_statement := strSelect_statement || ')';

  -- Open the cursor

  OPEN p_cur_result FOR strSelect_statement;
END p_get_xxx;

祝你好运。