如何将循环游标(当前行)传递给另一个函数/过程?

时间:2016-10-12 10:04:00

标签: oracle plsql oracle12c

我必须在循环中构建一些代码并且它会变得非常庞大。为了使不是必要的敌人,我想为了便于阅读而拆分我的代码。

我的代码看起来像这样:

FOR cur_tblA IN (SELECT col1, col2 FROM tblA) LOOP
  -- a lot of stuff
  NULL;
END LOOP;

因为现实生活中的第二行确实非常多,所以我想将光标cur_tblA传递给其他函数。我希望cur_tblA的值是当前行,我可以在我的其他函数/过程中访问cur_tblA.col1等值:

FUNCTION do_stuff(cur_tblA) RETURN VARCHAR2 AS BEGIN
    return cur_tblA.col1;
END do_stuff;

接收cur_tblA签名的正确类型是什么?

1 个答案:

答案 0 :(得分:1)

您无法直接使用该类型的游标循环执行此操作,但可以使用包中定义的记录类型的open / fetch;类似的东西:

TYPE rec_type IS RECORD (col1 tblA.col1%TYPE, col2 tblA.col2%TYPE);

然后在你的主程序中声明一个该类型的变量并获取它:

rec rec_type;
...
OPEN cur_tblA FOR SELECT col1, col2 FROM tblA;
LOOP
  FETCH cur_tblA INTO rec
  EXIT WHEN cur_tblA%NOTFOUND;
  do_stuff(rec);
END LOOP;

子功能声明将是:

FUNCTION do_stuff(p_rec rec_type) RETURN VARCHAR2 AS BEGIN
  return p_rec.col1;
END do_stuff;

如果适合您的进一步处理,您还可以定义并传递记录集合。并且程序/功能不一定都必须在同一个包中 - 如果类型在包规范中公开声明,则可以参考your_package.rec_type。虽然在这种情况下,听起来他们都会在一起。