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)
);
/
문제는 Table 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)을 검색하는 방법을 찾도록 도와 줄 수 있습니까? 나는 이미 공급 업체와 제품을 매핑 할 수있는 수업을 가지고 있으며, 자바에서 오라클로 각 배열을 통과 시켰으므로 양호합니다.
공급 업체
-> supplier1
-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;