حلقة من خلال الجداول المتداخلة في أوراكل وإعادة قائمة الكائنات إلى جافا
-
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;
لكنه لم يتم العثور على بيانات موجودة للاختيار الأول.
لذا ، هل يمكن لشخص ما مساعدتي في العثور على طريقة لاسترداد قائمة (prodtable) من Oracle إلى Java؟ لدي بالفعل الفصل لتعيين مورد ومنتج ، حتى أنني مررت بمجموعة من كل واحد منهم من Java إلى Oracle ، لذلك فهي جيدة ، أنا فقط بحاجة إلى أن تبدو J-Tree مثل هذا:
الموردين
-> المورد 1
-prod1
-prod2
- ...
-> المورد 2
-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;