Pregunta

Tengo esta tabla creada de la siguiente manera:

    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)
   ); 
/

El problema es que estoy tratando de obtener una lista de productos para cada proveedor, de la tabla fornecprods, pero no puedo (mi idea era devolver una estructura como un hash con: list_of_products). Para probar eso, utilicé este código solo para imprimir productos de cada proveedor:

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;

Pero no devolvió los datos encontrados para la primera selección.

Entonces, ¿alguien podría ayudarme a encontrar una manera de recuperar una lista (manejable) de Oracle a Java? Ya tengo la clase para mapear un proveedor y un producto, incluso pasé una matriz de cada uno de ellos de Java a Oracle, por lo que son buenos, solo necesito que mi árbol J se vea así:

Proveedor
-> proveedor1
-Prod1
-Prod2
- ...
-> proveedor2
-Prod1
-Prod2
- ....

¿Es posible recuperar toda esa información como un hash de supplier:list_of_products con mi tabla y tipos actuales?

¿Fue útil?

Solución

Primero sugeriría que no almacene permanentemente tablas anidadas en la base de datos. Si bien los tipos de objetos pueden ser realmente útiles para variables y resultados temporales, encontrará que las tablas anidadas tienden a complicar las consultas SQL, agregan gastos generales y en general Producir código que sea menos mantenible que los diseños normalizados relacionales regulares.

Ahora para su problema, primero llenemos su mesa:

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

Luego pasarías a través de los elementos simplemente:

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

Otros consejos

@Vincent Malgrat: ¡Gracias, tu consejo realmente funcionó para mí! Reorganicé mi código y se me ocurrió esta función: crear o reemplazar

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top