У меня есть следующие таблицы:
CREATE TABLE bodega ( --winery
id_bod INTEGER NOT NULL,
prod_an_bod nt_tipo_valor , --annual production
)
CREATE TABLE marca ( --wine
id_marca INTEGER NOT NULL,
prod_an_marca nt_tipo_valor , --annual production
)
CREATE TABLE presentacion ( --n:m relation table
id_pres INTEGER NOT NULL,
bodega_fk INTEGER NOT NULL,
marca_fk INTEGER NOT NULL
)
И prod_an_marca в таблице marca, и prod_an_bod в таблице bodega являются вложенными таблицами следующего типа:
CREATE OR REPLACE TYPE tipo_valor AS OBJECT (
ano DATE, --year
cantidad INTEGER --ammount of wine produced
)
У меня естьвыполнила следующую процедуру, которая должна получить количество вина, произведенного какой-либо данной винодельней в любой данный год, цель этого состоит в том, чтобы позже вставить эту сумму во вложенную таблицу для значений производства в винодельне, способ, которым это работает черезтаблица отношений n: m (Presentacion), в которой хранится внешний ключ для (bodega) и внешний ключ для (marca) wine.
Я использую курсор, который извлекает производственные суммы за данный годи суммирует их, используя SUM в выборке, проблема в том, что он суммирует каждое отдельное производственное значение, которое соответствует критериям поиска, это означает, что он извлекает производственные значения для всех вин, принадлежащих винодельне, но суммирует значения за каждый год, а неуказанный год.
Я пытался использовать GROUP BY для группировки суммыпо году, в котором хранится правильное значение для каждого года, сохраненного в курсоре, это может сработать, но мне нужен способ вставить их во вложенную таблицу для производственных показателей винодельни, я не уверен, как я могу это сделать, любойбыла бы признательна за помощь.
Create or replace procedure prueba(idbod INTEGER, ano DATE)
CURSOR prodbod IS
SELECT
sum(nt.cantidad)
FROM bodega b,
presentacion p,
marca m,
TABLE(m.prod_an_marca) nt
WHERE m.id_marca = p.marca_fk
AND b.id_bod = p.bodega_fk
AND b.id_bod = idbod
AND nt.ano = ano;
tempvar INTEGER;
BEGIN
OPEN prodbod;
LOOP
FETCH prodbod INTO tempvar;
EXIT WHEN prodbod%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('tempvar:'||to_char(tempvar));
END LOOP;
CLOSE prodbod;
END;