首页 > 解决方案 > 访问子变量pl sql

问题描述

我正在尝试通过父对象访问对象的子变量

declare
  i a22;
  i1 VARCHAR(10);
begin
  i := a22('a22', t_b1(
                       b22('b22', t_a1(a22('a22_2', t_b1(b22('b22_2', t_a1())))))
                       )


           );

   dbms_output.put_line('i.name_a1='||i.name_a1);
   dbms_output.put_line('i.t_b1(1).name_b1='||i.o_b(1).name_b1);
   dbms_output.put_line('i.o_b(1).o_a(1).name_a1='||i.o_b(1).o_a(1).name_a1);
end;
/

编译时出现错误提示需要声明变量。父对象不知道子对象的变量是合乎逻辑的。但是在成功初始化所有内容时。如何访问子变量?

对象本身:

Create type a1 is object (
  name_a1 varchar2(10)
) NOT FINAL NOT INSTANTIABLE;

Create type b1 is object (
  name_b1 varchar2(10)
) NOT FINAL NOT INSTANTIABLE;

create type t_a1 is table of a1;
create type t_b1 is table of b1;

Create type b22 UNDER b1 (
  o_a t_a1
) INSTANTIABLE;

Create type a22 UNDER a1 (
  o_b t_b1
) INSTANTIABLE;

标签: oracleplsqluser-defined-types

解决方案


您可以使用该TREAT函数访问对象子类型的属性。

由于o_b是类型table of b1,您必须将对象o_b(1)视为b22因为只有b22对象包含类型的成员table of a1

dbms_output.put_line('i.o_b(1).o_a(1).name_a1='||treat(i.o_b(1) as b22).o_a(1).name_a1);

结果:

dbms_output:
i.o_b(1).o_a(1).name_a1=a22_2

db<>在这里摆弄


推荐阅读