Динамическая выборка данных в коллекциях - PullRequest
0 голосов
/ 28 ноября 2018

Мне нужно использовать коллекции, как показано ниже, но я хочу печатать вывод динамически, а не указывать 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 голосов
/ 28 ноября 2018

Вы можете использовать таблицу PL / SQL внутри ЗАПИСИ.Попробуйте это:

DECLARE
    TYPE PL_TABLE_TYPE IS TABLE OF NUMBER;
    TYPE RT IS RECORD (ITEM  VARCHAR2(20), PL_TABLE PL_TABLE_TYPE);
    TYPE TT IS TABLE OF RT;

    MY_TAB TT := TT();
BEGIN

    MY_TAB.EXTEND;
    MY_TAB(MY_TAB.LAST).ITEM := 'ABC';
    MY_TAB(MY_TAB.LAST).PL_TABLE := PL_TABLE_TYPE(40,42,33,46,48); 
    --> Why do you assign strings like '40' if you have a NUMBER data type?

    MY_TAB.EXTEND;
    MY_TAB(MY_TAB.LAST).ITEM := 'DEF';
    MY_TAB(MY_TAB.LAST).PL_TABLE := PL_TABLE_TYPE(60,62,64,66,68);

    FOR r IN MY_TAB.FIRST..MY_TAB.LAST LOOP
        DBMS_OUTPUT.PUT(MY_TAB(r).ITEM || ' ');
        FOR i IN MY_TAB(r).PL_TABLE.FIRST..MY_TAB(r).PL_TABLE.LAST LOOP
            DBMS_OUTPUT.PUT(MY_TAB(r).PL_TABLE(i) || ' ');
        END LOOP;
        DBMS_OUTPUT.NEW_LINE;
    END LOOP;

END;
0 голосов
/ 28 ноября 2018

Одним из способов является создание 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...