Schleifen Sie durch verschachtelte Tabellen in Oracle und geben Sie eine Liste von Objekten an Java zurück
-
20-09-2019 - |
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?
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;