Question

J'ai ce tableau créé comme suit:

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

Le problème est que j'essaie d'obtenir une liste de produits pour chaque fournisseur, de Table Fornecprods, mais je ne peux pas (mon idée était de retourner une structure comme un hachage avec: list_of_products). Pour essayer cela, j'ai utilisé ce code uniquement pour imprimer des produits de chaque fournisseur:

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;

Mais il n'a renvoyé aucune donnée trouvée pour le premier sélection.

Alors, quelqu'un pourrait-il m'aider à trouver un moyen de récupérer une liste (ProdTable) d'Oracle à Java? J'ai déjà la classe pour cartographier un fournisseur et un produit, j'ai même passé une gamme de chacun d'eux de Java à Oracle, donc ils sont bons, j'ai seulement besoin de mon j-tree pour ressembler à ceci:

FOURNISSEURS
-> Fournisseur1
-prod1
-prod2
- ...
-> Fournisseur2
-prod1
-prod2
- ....

Est-il possible de récupérer toutes ces informations comme un hachage de supplier:list_of_products avec ma table et mes types actuels?

Était-ce utile?

La solution

Je suggérerais d'abord contre le stockage de tables imbriquées en permanence dans la base de données. Bien que les types d'objets puissent être très utiles pour les variables et les résultats temporaires, vous constaterez que les tables imbriquées ont tendance à compliquer les requêtes SQL, à ajouter des frais généraux et en général produire du code moins maintenable que les conceptions normalisées relationnelles régulières.

Maintenant, pour votre problème, peusons d'abord votre table:

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

Vous traverseriez ensuite les éléments plutôt simplement:

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

Autres conseils

@Vincent Malgrat: Merci, votre conseil a vraiment fonctionné pour moi! J'ai réorganisé mon code et trouvé cette fonction: créer ou remplacer

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top