0

我正在使用 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;
4

1 回答 1

0

表集合表达式返回带有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,您也可以获取行。)VARRAYNULL

所以,对于数据:

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<>在这里摆弄

于 2020-11-08T12:19:44.523 回答