如何传递从多个表创建的 PL/SQL 游标记录?



这是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 放入另一条记录中。 再一次,这些是记录,所以我假设这是一个确切的获取。 如果这不是您想要的,请在评论中告诉我。

最新更新