这是12c数据库中的PL/SQL。
我需要能够将游标记录传递给函数。 问题是光标来自三个不同的表,其中一个必须使用 * 来选择该表中的所有(数百个)字段.
如果我选择不同的字段(从较小的测试表中)它有效,如果我从一个表中使用 select * 而不使用其他字段(不涉及其他表),它就可以工作, 但是当从三个表中进行选择(示例仅显示两个)并从其中一个表中使用 *(选择所有字段)时,我找不到任何方法来完成这项工作。
我已经尝试过使用预定义的光标提取到和选择输入。 我尝试使用带有 FOR myRecord IN (SELECT a.*, ...) 和 创建匹配对象(因为无法在架构级别创建记录)
这些工作
myVarA a%ROWTYPE;
SELECT a.* INTO myVarA
FROM a;
SELECT a.myAfield, b.myBfield INTO myVarA, myVarB
FROM a, b;
但我需要这个来工作:
myVarA a%ROWTYPE;
SELECT a.*, b.myBfield INTO myVarA, myVarB
FROM a, b;
使用游标记录
myRecord myObjectTypeWithAllFields; -- ojbect, not record as record can't be declared at schema level
FOR myRecord IN (SELECT a.*, b.myBfield FROM a, b);
newVar := myFunction(myRecord); -- this won't work
使用 PLS-00306 调用函数失败:调用 myFunction 时参数的数量或类型错误;
该函数将完成许多包中类似的繁重工作,但也有大量独特的工作 在每个包中,所以我不能只处理函数中的整个游标循环。我真的需要一次将一行传递给函数。
有没有办法做到这一点?
您可以使用相同的选择列表在包中定义游标 - 无论您是否实际使用它:
create package p as
cursor c is select a.*, b.myBField
from a, b; -- but use proper join syntax
end;
/
然后使用该游标的%rowtype
定义函数参数:
create function myFunction(p_record p.c%rowtype) return ... as ...
然后你的块将工作:
FOR myRecord IN (SELECT a.*, b.myBfield FROM a, b) LOOP
newVar := myFunction(myRecord);
END LOOP;
数据库<>小提琴演示
然后,如果需要,游标 for 循环可以使用包中定义的游标。
>顺便提一下,在您的对象版本中,变量声明:myRecord myObjectTypeWithAllFields;
是多余的;FOR myRecord...
中的myRecord
是完全独立的。因此,它甚至不会尝试使用对象类型。
您正在使用 %rowtype 锚点,所以我假设一个确切的获取。Oracle 不允许使用带有"into"子句的多个记录。但是我们可以对此有一个解决方法。
DECLARE
emprec EMPLOYEES%ROWTYPE;
deptname DEPARTMENTS.department_name%type;
BEGIN
select a.* into emprec
from EMPLOYEES a
WHERE EMPLOYEE_ID = 100;
SELECT DEPARTMENT_NAME into deptname
from DEPARTMENTS where DEPARTMENT_ID = emprec.DEPARTMENT_ID;
END;
此示例演示如何在记录中获取 a.*,并与另一个表进行内部联接,并将 b.myBfield 放入另一条记录中。 再一次,这些是记录,所以我假设这是一个确切的获取。 如果这不是您想要的,请在评论中告诉我。