【问题标题】:for loop inside a cursor oracle游标oracle内的for循环
【发布时间】:2016-05-03 18:51:31
【问题描述】:

我已经创建了一个类型

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'

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

【问题讨论】:

  • 那个 plsql 代码看起来很像书本。只是这部分“OPEN p_cur_result FOR for i IN l_array.first .. l_array.last”是错误的,看起来像是从不同示例中复制粘贴。

标签: oracle stored-procedures cursor


【解决方案1】:

游标总是在 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;

祝你好运。

【讨论】:

  • 感谢您的回复。我的 SELECT 语句接近 100 行 - 我会尝试这种方法,如果可行,我会及时通知您。
  • 我尝试了这种方法并打印出所有循环后生成的 sql,当我在编辑器上运行 sql 时,它按预期工作。但是当我运行实际过程时,不知何故 CURSOR 只返回与数组中最后一个元素相关的记录。有没有人在使用 CURSORS 时遇到过这种问题?
  • 我建议您发布另一个问题来解决这个问题,包括所有涉及的代码 - 创建 SQL 语句的 PL/SQL 和生成的 SQL 语句本身。谢谢。
  • 按照stackoverflow.com/questions/35045410/…的建议发布了另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多