Зацикливание через вложенные таблицы в Oracle и возвращение списка объектов на Java

StackOverflow https://stackoverflow.com/questions/2069418

Вопрос

У меня создан эта таблица следующим образом:

    CREATE TABLE FORNECPRODS 
       (    SUPPLIER FORNEC_OBJ , 
        PRODUCTS PRODTABLE 
       )NESTED TABLE "PRODUCTS" STORE AS "PRODUCTSTABLE";
    /

    create or replace
    type PRODTABLE as table of PROD_OBJ;

    create or replace
    TYPE PROD_OBJ AS OBJECT (

       ID_PROD              NUMBER(6,0),
       NOME_PROD            VARCHAR2(100),        
       PREC_COMPRA_PROD     NUMBER(10,2),         
       PREC_VENDA_PROD      NUMBER(10,2),         
       QTD_STOCK_PROD       NUMBER(10),
       QTD_STOCK_MIN_PROD   NUMBER(10),
       IVA_PROD             NUMBER(6,2)
    );

/
create or replace
type PRODTABLE as table of PROD_OBJ;
/
create or replace type FORNEC_OBJ as object (
   ID_FORNECEDOR        NUMBER(6) ,
   NOME_FORNECEDOR      VARCHAR2(100) ,
   MORADA               VARCHAR2(300),
   ARMAZEM              VARCHAR2(300),
   EMAIL                VARCHAR2(30),
   TLF                  NUMBER(30) ,
   TLM                  NUMBER(30),
   FAX                  NUMBER(30)
   ); 
/

Проблема в том, что я пытаюсь получить список продуктов для каждого поставщика, из таблицы FornecProds, но я не могу (моя идея заключалась в том, чтобы вернуть структуру, подобную хэш с: list_of_products). Чтобы попробовать это, я использовал этот код только для печати продуктов от каждого поставщика:

declare
    v_products    prodtable;
    TYPE t_supplier is TABLE OF FORNEC_OBJ;
    v_supplier           t_supplier;

begin
    select supplier bulk collect into v_supplier from fornecprods;
    for j in v_supplier.first.. v_supplier.last
    loop
        select products into v_products
        from fornecprods where supplier = v_supplier(j);
        dbms_output.put_line('-----------------------');
        dbms_output.put_line('Products list of ' || v_supplier(j).NOME_FORNECEDOR);
        dbms_output.put_line('-----------------------');
        for i in v_products.first .. v_products.last
        loop
            dbms_output.put(v_products(i).NOME_PROD);
        end loop;
    end loop;
end;

Но он не вернул данные для первого выбора.

Итак, может ли кто -нибудь помочь мне найти способ получить список (prodtable) из Oracle до Java? У меня уже есть класс, чтобы отобразить поставщика и продукт, я даже передал массив каждого из них от Java в Oracle, так что они хороши, мне нужно только мой J-дерево, чтобы выглядеть так:

Поставщики
-> Поставщик1
-Под1
-prod2
- ...
-> Поставщик2
-Под1
-prod2
- ....

Можно ли получить всю эту информацию, как хэш supplier:list_of_products с моей текущей таблицей и типами?

Это было полезно?

Решение

Сначала я бы предложил навсегда хранение вложенных таблиц в базе данных. В то время как типы объектов могут быть действительно полезны для переменных и временных результатов, вы обнаружите, что вложенные таблицы, как правило, усложняют запросы SQL, добавляют накладные расходы и в целом Создайте код, который менее поддерживается, чем регулярные нормированные реляционные конструкции.

Теперь для вашей проблемы, сначала давайте заполним ваш стол:

SQL> DECLARE
  2     l_prodtable prodtable := prodtable();
  3  BEGIN
  4     l_prodtable.extend(2);
  5     l_prodtable(1) := prod_obj(1, 'Prod A', '', '', '', '', '');
  6     l_prodtable(2) := prod_obj(2, 'Prod B', '', '', '', '', '');
  7     FOR i IN 1 .. 2 LOOP
  8        INSERT INTO fornecprods VALUES (fornec_obj(i, 'Forn '||i, '',
  9                                                   '', '', '', '', ''),
 10                                        l_prodtable);
 11     END LOOP;
 12  END;
 13  /     
PL/SQL procedure successfully completed

Затем вы бы проберовали элементы просто просто:

SQL> BEGIN
  2     FOR cc IN (SELECT supplier, products FROM fornecprods) LOOP
  3        dbms_output.put_line('-----------------------');
  4        dbms_output.put_line('Products list of '
  5                             || cc.supplier.NOME_FORNECEDOR);
  6        dbms_output.put_line('-----------------------');
  7        FOR i IN 1 .. cc.products.count LOOP
  8           dbms_output.put_line('-' || cc.products(i).NOME_PROD);
  9        END LOOP;
 10     END LOOP;
 11  END;
 12  /

-----------------------
Products list of Forn 1
-----------------------
-Prod A
-Prod B
-----------------------
Products list of Forn 2
-----------------------
-Prod A
-Prod B

PL/SQL procedure successfully completed

Другие советы

@Vincent Malgrat: Спасибо, ваш совет действительно сработал для меня! Я переставил свой код и придумал эту функцию: создать или заменить

function getAllSuppliersObjects RETURN FORNECTABLE AS
  suppliersList FORNECTABLE := FORNECTABLE();

BEGIN
     FOR res IN (SELECT supplier, products FROM fornecprods) LOOP
        /*dbms_output.put_line('-----------------------');
        dbms_output.put_line('Existent suppliers: '
                             || res.supplier.NOME_FORNECEDOR);*/
        suppliersList.extend;
        suppliersList(suppliersList.last):= res.supplier;
     END LOOP;
     return suppliersList;
  END;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top