我必须在循环中构建一些代码并且它会变得非常庞大。为了使不是必要的敌人,我想为了便于阅读而拆分我的代码。
我的代码看起来像这样:
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
签名的正确类型是什么?
答案 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
。虽然在这种情况下,听起来他们都会在一起。