Oracleのネストされたテーブルをループし、Javaにオブジェクトのリストを返す
-
20-09-2019 - |
質問
私は次のようにこのテーブルを作成しました:
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;
しかし、最初の選択で見つかったデータは返されませんでした。
だから、誰かが私がOracleからJavaにリスト(Prodtable)を取得する方法を見つけるのを手伝ってくれませんか?私はすでにサプライヤーと製品をマッピングするクラスを持っています、私はそれらのそれぞれの配列をJavaからOracleに渡しました。
サプライヤー
- > Supplier11
-Prod1
-Prod2
- ...
- > Supplier2
-Prod1
-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;