невозможно использовать DBMS_OUTPUT.PUT_LINE с массовым сбором в - PullRequest
0 голосов
/ 01 января 2019

Это первый раз, когда я пытаюсь написать PL / SQL.

У меня есть таблица T_TRANSACTION с несколькими столбцами.Я хочу, чтобы мой PL / SQL первоначально извлекал отдельные значения определенного столбца с именем mandant и сохранял его в курсоре.затем я хочу написать цикл for, в котором для каждого mandant из курсора мой основной запрос делает некоторые вещи.

Основной запрос - это базовый выбор, который, очевидно, не работает в PL / SQL, и именно поэтому я использовал выбор в, и так как он возвращает более 1 строки, я увидел, что я должен использовать сбор в BULK.У меня есть готовый pl / sql сейчас, который технически работает, но я не могу вывести результаты (не могу правильно использовать DBMS_OUTPUT.PUT_LINE), и поэтому я не знаю, если это правильно.вот PL / SQL:

declare 
    cursor c1 is
        SELECT distinct mandant  from T_TRANSACTION;
        type mytab is table of VARCHAR2(20);
        colname mytab := mytab();
        colval mytab := mytab();
        colcount mytab := mytab();

BEGIN

     for i in c1
     loop
                select 'PARTNER_ID' as column_name, to_char(col), cnt bulk collect into colname, colval, colcount
                from (select PARTNER_ID as col, count(*) as cnt
                            from T_TRANSACTION
                            where SML like '181031%A' and mandant = i.mandant
                            group by PARTNER_ID 
                            order by count(*)desc) 
                 where rownum <=3
                 connect by level <=3;

    end loop;

    -- DBMS_OUTPUT.PUT_LINE (colname || colval || colcount);
end; 

и это моя таблица T_TRANSACTION:

   CREATE TABLE T_TRANSACTION 
   (    MANDANT CHAR(5 CHAR), 
    SML VARCHAR2(15 BYTE), 
    RUN CHAR(1 CHAR), 
    SL_PARTNER_RISK VARCHAR2(20 BYTE), 
    GESCHAEFT_ID VARCHAR2(20 BYTE), 
    PARTNER_ID VARCHAR2(20 BYTE), 
    TRANS_ID VARCHAR2(20 BYTE);  

в запросе ниже я получаю верхние 3 значения столбца PARTNER_IDза каждый mandant от курсора.

Мой второй вопрос на самом деле: как я могу сделать это для всех столбцов таблицы, не повторяя запрос?Позже я хочу использовать это для многих разных таблиц, и поэтому я хочу извлечь столбец для каждой таблицы, например, из all_tab_columns, а затем выполнить запрос, который я разместил для всех столбцов каждой таблицы.Но я не знаю, как это сделать в PL / SQL.Я ценю любую помощь:)

1 Ответ

0 голосов
/ 01 января 2019

После выборки данных вы должны использовать другой цикл (от first до last элемента) (строки 10-12 в моем примере) и затем отображать эти значения.

Посмотрите на этот пример на основе схемы Скотта:

SQL> set serveroutput on;
SQL> declare
  2    t_deptno sys.odcinumberlist;
  3    t_dname  sys.odcivarchar2list;
  4    cursor cur_r is select deptno, dname from dept;
  5  begin
  6    open cur_r;
  7    fetch cur_r bulk collect into t_deptno, t_dname;
  8    close cur_r;
  9
 10    for i in t_deptno.first .. t_deptno.last loop
 11      dbms_output.put_line(t_deptno(i) ||' '|| t_dname(i));
 12    end loop;
 13  end;
 14  /
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

PL/SQL procedure successfully completed.

SQL>
...