Как я могу вставить во вложенную таблицу из набора результатов оператора выбора? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть две таблицы с вложенными таблицами одного типа, тип:

CREATE OR REPLACE TYPE tipo_valor AS OBJECT (
ano        DATE,   --year
cantidad   INTEGER  --ammount of exported wine
) ;

CREATE OR REPLACE TYPE hist_export AS OBJECT (
   nombre_pais   VARCHAR2(100),  --name of importer country
   cantidad      tipo_valor --type referenced above
 );

вложенная таблица:

CREATE OR REPLACE TYPE nt_hist_exp IS
TABLE OF hist_export;

И две мои таблицы:

CREATE TABLE bodega (  --winery
    id_bod                   INTEGER NOT NULL,
    exp_an_bod               nt_hist_exp ,
)

CREATE TABLE marca (  --wine
id_marca                INTEGER NOT NULL,
exp_an_marca            nt_hist_exp 
)

У меня есть процедура с оператором select, которая собирает суммы экспорта из таблицы вин на определенный год и упорядочивает их по странам,

PROCEDURE exp_bod ( p_ano DATE,
                      p_bod_nom VARCHAR2)IS
    sumatoria INTEGER;
    p_idbod INTEGER;
    BEGIN
      SELECT id_bod INTO p_idbod
      FROM bodega 
      WHERE nombre_bod = p_bod_nom;
      DBMS_OUTPUT.PUT_LINE(to_char(p_idbod));
      SELECT nt.nombre_pais,sum(nt.cantidad.cantidad)
      INTO sumatoria
      FROM bodega b
      JOIN presentacion p on p.bodega_fk = b.id_bod
      JOIN marca m on m.id_marca = p.marca_fk
      CROSS JOIN TABLE(m.exp_an_marca) nt
      WHERE b.id_bod = p_idbod
      AND nt.cantidad.ano = p_ano
      group by nt.nombre_pais
      order by nt.nombre_pais;
      );

end exp_bod;

, второй выбор в этой процедуре успешно возвращает то, чтоМне нужен набор результатов с двумя столбцами, один с названиями стран, а второй с суммами экспорта, которые суммируются и упорядочиваются. Я хочу вставить строки из этого набора результатов во вложенную таблицу в таблице винодельни, включаягод, полученный в качестве аргумента функцией

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете использовать insert as select, создавая экземпляр вашего типа объекта как часть запроса:

INSERT INTO TABLE (SELECT exp_an_bod FROM bodega b WHERE b.nombre_bod = p_bod_nom)
SELECT hist_export(nt.nombre_pais, tipo_valor(nt.cantidad.ano, sum(nt.cantidad.cantidad)))
FROM bodega b
JOIN presentacion p on p.bodega_fk = b.id_bod
JOIN marca m on m.id_marca = p.marca_fk
CROSS JOIN TABLE(m.exp_an_marca) nt
WHERE b.nombre_bod = p_bod_nom
AND nt.cantidad.ano = p_ano
GROUP BY nt.nombre_pais, nt.cantidad.ano;

Я предполагаю, что nombre_bod - это столбец на bodega, хотя у вас нетне показано, что в определении таблицы это означает, что вам не нужен отдельный поиск для этого.

Это также предполагает, что exp_an_bod не равно нулю;это может быть пустым, хотя.Он также не учитывает существующую строку для страны, но из вашей модели данных не очень ясно, может ли она существовать или что должно произойти, если это произойдет.Вы можете обновить существующую запись, используя тот же механизм, если вы можете ее идентифицировать.

0 голосов
/ 19 декабря 2018

Вы можете сделать это в PL / SQL следующим образом:

declare
   hist_exp nt_hist_exp;
begin
   select exp_an_bod
   into hist_exp
   from bodega 
   where id_bod = 123;

   hist_exp.extend;
   hist_exp(hist_exp.LAST) := hist_export('xyz', 456);

   update bodega 
   set exp_an_bod = hist_exp
   where id_bod = 123;

end;

Если вам нравится ОБНОВЛЕНИЕ, а не ВСТАВКА, вы также можете использовать

UPDATE (select nombre_pais, cantida, id_bod FROM bodega CROSS JOIN TABLE(exp_an_bod))  
SET nombre_pais = 'abc'
WHERE id_bod = 123
   and cantida = 456;

Вы также можете попробовать

INSERT INTO (select nombre_pais, cantida, id_bod FROM bodega CROSS JOIN TABLE(exp_an_bod)) ...

но я не думаю, что это возможно - я никогда не пробовал.

...