【问题标题】:Looping through nested tables in oracle and returning a list of objects to java遍历oracle中的嵌套表并将对象列表返回给java
【发布时间】:2010-01-15 03:57:44
【问题描述】:

我创建了这个表如下:

    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,所以它们很好,我只需要我的 j-tree 看起来像这样:

供应商
->供应商1
-prod1
-prod2
- ...
->供应商2
-prod1
-prod2
- ....

是否可以使用我当前的表和类型检索所有信息,例如 supplier:list_of_products 的哈希?

【问题讨论】:

  • 请看下面我的回答(我猜是因为 cmets 不允许代码格式:s)

标签: java oracle object nested plsqldeveloper


【解决方案1】:

首先,我建议不要在数据库中永久存储嵌套表。虽然对象类型对于变量和临时结果非常有用,但您会发现嵌套表往往会使 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

【讨论】:

    【解决方案2】:

    @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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2021-04-10
      • 2016-01-13
      • 2020-03-10
      • 2019-02-12
      • 2019-08-22
      相关资源
      最近更新 更多