标题:如何使用在 select 语句中获取记录的函数



这段代码可以正常工作

declare
tA table of rA; --where ra is a record
tB table of rB; --where rb is a record
A Ta;
B Tb;  
begin
A    :=gettA(); -- where gettA return type is tA
B    :=gettBFromtA(A); -- where gettB return type is tB and take an input of type tA
end;

但现在我处于这种情况:

我没有得到BFromtA,而是getrBFromRa,其中getrBFromRa返回类型是rB,并接受rA类型的输入。我想从 A 那里得到 B。

在开始时执行与代码中相同的操作的解决方案是创建一个中间函数Inter,例如

function Inter (arg1 in ra.field1%type, ….. argn in ra.fieldn%type ) return rb
is
a ra;
b rb
begin
ra.arg1 := arg1 ….. ra.argn := argn
return getrBFromRa(a);
end;

并将倒数第二行替换为

select Inter(t.arg1, … t.argn) bulk collect into B from table(A) t.

有没有更简单的方法可以做到这一点?

除此之外,记录的定义可能会改变。而且我想避免多次写下我的记录字段的名称。

我正在寻找一种直接在选择语句中使用getrBFromrA的方法。

我试图模拟你的问题。首先,我在DB中创建了以下对象:

CREATE table stack59565292(
ID number(6),
NAME varchar2(20)
);
insert into stack59565292 values (1, 'VOLKAN');
insert into stack59565292 values (2, 'PIERRE');
commit;
/

CREATE OR REPLACE TYPE stack59565292_typeA AS OBJECT
(        ID number(6),
NAME varchar2(20)
);
CREATE OR REPLACE TYPE stack59565292_typeB AS OBJECT
( NAME varchar2(20)
);
CREATE OR REPLACE TYPE stack59565292_type_TABa AS TABLE OF stack59565292_typeA;
CREATE OR REPLACE TYPE stack59565292_type_TABb AS TABLE OF stack59565292_typeB;

然后,下面的过程可以根据需要工作。类型构造函数完成这项工作。并且您应该在模式中定义集合类型:http://www.dba-oracle.com/t_pls_00642_local_collection_types_not_allowed_in_sql_statement.htm

declare
A stack59565292_type_TABa;
B stack59565292_type_TABb;
begin
-- Test statements here
select stack59565292_typeA(x.ID, x.NAME)
BULK COLLECT
INTO A
from stack59565292 x;
FOR v_iterate IN A.FIRST .. A.LAST LOOP
dbms_output.put_line('ID: ' || A(v_iterate).ID || ' - NAME: ' || A(v_iterate).NAME);
END LOOP;
select stack59565292_typeB(x.NAME) BULK COLLECT INTO B from table(A) x;

FOR v_iterate IN B.FIRST .. B.LAST LOOP
dbms_output.put_line('NAME: ' || B(v_iterate).NAME);
END LOOP;
end;

最新更新