【问题标题】:ORACLE - select data from VARRAY OF REF ObjectORACLE - 从 VARRAY OF REF 对象中选择数据
【发布时间】:2021-02-20 13:23:53
【问题描述】:

我正在使用 ORACLE 并希望使用 REF 访问数组的对象。这是我的结构:

create type articulo as object (
    codigo_barras number,
    nombre varchar2(100),
    precio number,
    categoria varchar2(100),
    stock number
                               );

create table almacen of articulo(
    codigo_barras primary key
    );

create table estanteria(
    identificador varchar2(10) primary key ,
    pasillo number,
    seccion character,
    producto ref articulo scope is almacen
);

create type lista as VARRAY(5) of REF articulo;

create table escaparate(
  tablon number primary key ,
  lista_productos lista
);

insert into almacen values (1,'Destornillador',5,'Herramientas',20);
insert into almacen values (2,'Llave inglesa',12,'Herramientas',30);
insert into almacen values (3,'Martillo',16,'Herramientas',20);
insert into almacen values (4,'Soplete',24,'Maquinaria',5);
insert into almacen values (5,'Radial',35,'Maquinaria',10);

insert into estanteria
select 1,1,'A',ref(a)
from almacen a
where a.CODIGO_BARRAS=1;

insert into estanteria
select 2,3,'B',ref(a)
from almacen a
where a.CODIGO_BARRAS=4;

insert into escaparate
select 1,lista(REF(a1),REF(a2))
FROM almacen a1, almacen a2
where a1.CODIGO_BARRAS=1 and a2.CODIGO_BARRAS=2;

问题是当我尝试访问 escaparate 时,无法从 REFS 的 VARRAY 中获取数据。试过这个:

select e.tablon, t.nombre
from escaparate e, table( e.lista_productos ) t;

【问题讨论】:

    标签: sql oracle ref varray


    【解决方案1】:

    表集合表达式返回带有COLUMN_VALUE标识符的数据,您可以使用它来获取REF值:

    SELECT e.tablon,
           t.COLUMN_VALUE.nombre AS nombre
    FROM   escaparate e
           LEFT OUTER JOIN table( e.lista_productos ) t
           ON ( 1 = 1 );
    

    (您也可以LEFT OUTER JOIN 以便在VARRAY 为空或NULL 时获得行。)

    所以,对于数据:

    insert into escaparate ( tablon, lista_productos )
    VALUES (
      1,
      lista(
        ( SELECT REF(a) FROM almacen a WHERE CODIGO_BARRAS=1 ),
        ( SELECT REF(a) FROM almacen a WHERE CODIGO_BARRAS=2 )
      )
    );
    
    insert into escaparate ( tablon, lista_productos )
    VALUES ( 2,lista() );
    
    insert into escaparate ( tablon, lista_productos )
    VALUES ( 3, NULL );
    

    这个输出:

    制表符 |名词 -----: | :------------- 1 |毁灭者 1 |紫菜 2 | 3 |

    或者,如果你想要在数组中的位置,你可以使用LATERAL 加入:

    SELECT e.tablon,
           t.*
    FROM   escaparate e
           LEFT OUTER JOIN LATERAL (
             SELECT ROWNUM AS rn,
                    t.COLUMN_VALUE.nombre AS nombre
             FROM   TABLE( e.lista_productos ) t
           ) t
           ON ( 1 = 1 );
    

    哪些输出:

    制表符 |注册护士 |名词 -----: | ---: | :------------- 1 | 1 |毁灭者 1 | 2 |紫菜 2 | | 3 | |

    db小提琴here

    【讨论】:

    • 你可以简化最后一个例子,使用OUTER APPLY而不是LEFT OUTER JOIN LATERAL——这样你就不需要多余的ON条件了。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多