حلقة من خلال الجداول المتداخلة في أوراكل وإعادة قائمة الكائنات إلى جافا

StackOverflow https://stackoverflow.com/questions/2069418

سؤال

لقد تم إنشاء هذا الجدول على النحو التالي:

    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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top