Вывод результатов из EXECUTE IMMEDIATE PLSQL - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть скрипт, который запрашивает, что ALL_TAB_COLUMNS выполняет некоторую агрегацию, затем выполняется через

  EXECUTE IMMEDIATE vSelect into v_output;

сначала я v_output был целым числом, а vSelect сделал подсчет (*) и вернул число строк. Я хочу изменить vSelect на фактический

SELECT * FROM ALL_TAB_COLUMNS <MY_WHERE_CLAUSE> 

и выведите результаты, используя DBMS_OUTPUT.PUT_LINE. Я собираюсь настроить его на запись в файл журнала, как только смогу получить его для вывода, но сначала пытаюсь получить его для вывода. Oracle 11G

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Этот метод похож на @ Kaushik's, но использует цикл курсора вместо коллекции:

set serveroutput on
declare
  l_cursor sys_refcursor;
  l_row all_tab_columns%rowtype;
  l_where_clause varchar2(50) := q'[where owner = 'HR']';
begin
  open l_cursor for 'SELECT * FROM all_tab_columns ' || l_where_clause;
  loop
    fetch l_cursor into l_row;
    exit when l_cursor%notfound;
    dbms_output.put_line(l_row.owner ||','|| l_row.table_name ||','|| l_row.column_name);
  end loop;
end;
/

, который также получает:

HR,REGIONS,REGION_NAME
HR,REGIONS,REGION_ID
HR,LOCATIONS,COUNTRY_ID
HR,LOCATIONS,STATE_PROVINCE
HR,LOCATIONS,CITY
...

Несмотря на то, что это выполняется для отдельных однорядных выборок, в последних выпусках Oracle оптимизирует использование массовых операций в фоновом режиме, поэтому производительность должна быть аналогична явной bulk collect, просто без необходимости типа коллекции.

Предполагается, что вы на самом деле используете select * в своем запросе, поэтому есть таблица для %rowtype. Если запрос является более избирательным (что, как правило, хорошо) или объединяет несколько таблиц, вам следует объявить соответствующий тип записи.

0 голосов
/ 01 ноября 2018

Один из методов - использовать вложенную таблицу с переменной записи all_tab_columns%rowtype, а затем просмотреть ее для просмотра.

SET SERVEROUTPUT ON
    DECLARE
         TYPE tab_all_tab_rec IS
              TABLE OF all_tab_columns%rowtype;
         trec             tab_all_tab_rec;
         v_where_clause   CLOB := 'WHERE OWNER = ''HR''';
    BEGIN
         EXECUTE IMMEDIATE 'SELECT * 
         FROM all_tab_columns ' || v_where_clause BULK COLLECT
         INTO trec;
         FOR i IN trec.first..trec.last LOOP
              dbms_output.put_line(trec(i).owner || ',' || trec(i).table_name || ',' || trec(i).column_name
              ); --Other columns
         END LOOP;
  END;
  /

O / р

HR,COUNTRIES,COUNTRY_NAME
HR,COUNTRIES,COUNTRY_ID
HR,COUNTRIES,REGION_ID
HR,DEPARTMENTS,LOCATION_ID
HR,DEPARTMENTS,MANAGER_ID
HR,DEPARTMENTS,DEPARTMENT_NAME
HR,DEPARTMENTS,DEPARTMENT_ID
HR,EMPLOYEES,DEPARTMENT_ID
HR,EMPLOYEES,MANAGER_ID
HR,EMPLOYEES,COMMISSION_PCT
HR,EMPLOYEES,SALARY
HR,EMPLOYEES,JOB_ID
HR,EMPLOYEES,HIRE_DATE
HR,EMPLOYEES,PHONE_NUMBER
HR,EMPLOYEES,EMAIL
HR,EMPLOYEES,LAST_NAME
HR,EMPLOYEES,FIRST_NAME
HR,EMPLOYEES,EMPLOYEE_ID
..
..

PL/SQL procedure successfully completed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...