Schleifen Sie durch verschachtelte Tabellen in Oracle und geben Sie eine Liste von Objekten an Java zurück

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

Frage

Ich habe diese Tabelle wie folgt erstellt:

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

Das Problem ist, dass ich versuche, eine Liste von Produkten für jeden Lieferanten aus Tabelle Fornecprods zu erhalten, aber ich kann nicht (meine Idee war es, eine Struktur wie ein Hash mit: list_of_products zurückzugeben). Um dies zu versuchen, habe ich diesen Code nur verwendet, um Produkte von jedem Lieferanten zu drucken:

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;

Es wurden jedoch keine Daten für die erste Auswahl zurückgegeben.

Könnte mir bitte jemand helfen, einen Weg zu finden, um eine Liste (prodtable) von Oracle nach Java abzurufen? Ich habe bereits die Klasse, um einen Lieferanten und ein Produkt abzubilden. Ich habe sogar eine Reihe von jedem von Java zu Oracle übergeben, also sind sie gut, ich brauche nur meinen J-Tree, um so auszusehen:

LIEFERANTEN
-> Lieferant1
-Prod1
-Prod2
- ...
-> Lieferant2
-Prod1
-Prod2
- ....

Ist es möglich, alle Informationen wie ein Hash von abzurufen? supplier:list_of_products mit meiner aktuellen Tabelle und meinen aktuellen Typen?

War es hilfreich?

Lösung

Zuerst würde ich vorschlagen, dauerhaft verschachtelte Tabellen in der Datenbank zu speichern. Während Objekttypen für Variablen und temporäre Ergebnisse wirklich nützlich sein können, werden Sie feststellen, dass verschachtelte Tabellen dazu neigen, SQL -Abfragen zu komplizieren, Overhead hinzuzufügen und Im Algemeinen Erstellen Sie Code, der weniger wartbar ist als normale relationale normalisierte Designs.

Lassen Sie uns zuerst Ihren Tisch für Ihr Problem bevölkern:

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

Sie würden dann eher einfach die Elemente durchlaufen:

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

Andere Tipps

@Vincent Malgrat: Danke, dein Tipp hat wirklich für mich funktioniert! Ich habe meinen Code neu angeordnet und diese Funktion entwickelt: Erstellen oder Ersetzen

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top