在集合中动态获取数据

时间:2018-11-28 07:01:11

标签: oracle

我需要使用以下集合,但是要动态打印输出而不是指定PL01,PL02,PL03 ...,因为这将是一个更大的列表。如果无法使用RECORD类型,则如何使用集合来实现。

业务场景:在Excel工作表中将商品价格清单作为价格清单代码的第一行(每一列均指价格清单),并在每一行中包含不同的商品。价目表和物品的数量每次都不同。现在,我需要以相同的格式(表格中包含行中的项目以及价格列表代码作为列)填充此excel,并使用它来更新正确的价格列表。

DECLARE    
  TYPE RT IS RECORD (ITEM  VARCHAR2(20),
                     PL01  NUMBER,
                     PL02  NUMBER,
                     PL03  NUMBER,
                     PL04  NUMBER,
                     PL05  NUMBER);    
  TYPE TT IS TABLE OF RT;    
  MY_REC RT;
  MY_TAB TT := TT();    
BEGIN
  MY_TAB.EXTEND;

  MY_TAB(1).ITEM := 'ABC';
  MY_TAB(1).PL01 := '40';
  MY_TAB(1).PL02 := '42';
  MY_TAB(1).PL03 := '44';
  MY_TAB(1).PL04 := '46';
  MY_TAB(1).PL05 := '48';

  MY_TAB.EXTEND;

  MY_TAB(2).ITEM := 'DEF';
  MY_TAB(2).PL01 := '60';
  MY_TAB(2).PL02 := '62';
  MY_TAB(2).PL03 := '64';
  MY_TAB(2).PL04 := '66';
  MY_TAB(2).PL05 := '68';   

  FOR I IN 1..2
  LOOP
    Dbms_Output.PUT_LINE(MY_TAB(I).ITEM||' - '||MY_TAB(I).PL01||' - '||MY_TAB(I).PL02||' - '||
                         MY_TAB(I).PL03||' - '||MY_TAB(I).PL04||' - '||MY_TAB(I).PL05);
  END LOOP;

END;
/

2 个答案:

答案 0 :(得分:1)

一种方法是将TYPE创建为对象,并使用TABLE函数通过传递REFCURSOR进行显示。

CREATE OR REPLACE TYPE RT AS OBJECT ( ITEM  VARCHAR2(20),
                     PL01  NUMBER,
                     PL02  NUMBER,
                     PL03  NUMBER,
                     PL04  NUMBER,
                     PL05  NUMBER
                     );
                     /

CREATE OR REPLACE TYPE TT AS TABLE OF RT;  
/

VARIABLE x REFCURSOR;

DECLARE    
  MY_TAB TT := TT();    
BEGIN

  MY_TAB.EXTEND(2); --allocate 2 elements

  MY_TAB(1) := RT ( 'ABC',40,42,44,46,48);--you can assign all once/index
  MY_TAB(2) := RT ( 'DEF',60,62,64,66,68);

  OPEN :x FOR SELECT * FROM TABLE(MY_TAB);

END;
/

PRINT x
ITEM                       PL01       PL02       PL03       PL04       PL05
-------------------- ---------- ---------- ---------- ---------- ----------
ABC                          40         42         44         46         48
DEF                          60         62         64         66         68

答案 1 :(得分:0)

您可以在RECORD中使用PL / SQL表。试试这个:

"$JobStatus" == "COMPLETED"