Присвоение нескольких полей в цикле с использованием команды «немедленное выполнение» - PullRequest
2 голосов
/ 05 апреля 2019

Я использую библиотеки PLPDF для создания электронных таблиц для различных файлов - я пытаюсь получить процедуру, написанную для получения значений каждого поля, и последовательно вставлять их в электронную таблицу. Эта операция может включать в себя множество различных таблиц, входящих в различные таблицы, поэтому простое выполнение экспорта не приведет к его сокращению.

В этом примере созданы два курсора из таблиц - USER_TAB_COLUMNS для выбора имен столбцов и фактический запрос представления для извлечения данных. У меня есть один цикл, чтобы пройти запись данных по записи, а второй - по полям внутри записи.

Перед тем, как приступить к реальной записи в блоб электронной таблицы, я просто запускаю dbms_output.putline, чтобы убедиться, что получаю необходимые данные.

declare

    q_str varchar2(100);
    this_vc varchar2(3000);

    cursor diet_table is 
        select * from vcars_diet where nhp_id = 8573;

    cursor diet_stru is
        select 'begin :1 := i.' || column_name || '; end;' line_o_code from user_tab_columns where table_name = 'VCARS_DIET';

begin
    for i in diet_table loop

        DBMS_OUTPUT.PUT_LINE ('--------------------------------------------------------'); 
        for h in diet_stru loop

            DBMS_OUTPUT.PUT_LINE ('Varchar Value for i: "' || h.line_o_code || '"'); 
            EXECUTE IMMEDIATE (h.line_o_code) USING out this_vc;
            DBMS_OUTPUT.PUT_LINE ('Varchar Value for i.' || h.line_o_code || ' is: '||this_vc); 

        end loop;
    end loop;
end;

Поля в таблице диет:

NHP_ID
DATE_TIME
DIET_NO
FORM_NAME
DATA_TYPE 

Результаты:

ORA-06550: строка 1, столбец 13: PLS-00201: должен быть объявлен идентификатор «I.NHP_ID» ORA-06550: строка 1, колонка 7: PL / SQL: оператор игнорируется ORA-06512: в строке 33 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL. * Действие:

1 Ответ

0 голосов
/ 05 апреля 2019

Я скопировал этот код PL / SQL из решения Коннора Макдональда из этой статьи AskTom .Он использует тип динамического SQL для анализа любого запроса SQL и преобразует имена столбцов и значения в коллекцию.Я использовал пример запроса к таблице сотрудников в схеме HR.Замените его на ваш запрос.

set serverout on size 999999
set verify off
declare
    p_query varchar2(32767) := 
              q'{select * from employees 
                          where rownum = 1
                 }';-- Here you put your query  
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_descTbl       dbms_sql.desc_tab;
    l_colCnt        number;
    n number := 0;
  procedure p(msg varchar2) is
    l varchar2(4000) := msg;
  begin
    while length(l) > 0 loop
      dbms_output.put_line(substr(l,1,80));
      l := substr(l,81);
    end loop;
  end;
begin
    execute immediate
    'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';

    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );

    for i in 1 .. l_colCnt loop
        dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000);
    end loop;

    l_status := dbms_sql.execute(l_theCursor);

    while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value( l_theCursor, i, l_columnValue );
            p( 'Value for '|| l_descTbl(i).col_name
              || ' is: ' || 
              l_columnValue );
        end loop;
        dbms_output.put_line( '-----------------' );
        n := n + 1;
    end loop;
    if n = 0 then
      dbms_output.put_line( chr(10)||'No data found '||chr(10) );
    end if;
end;
/

Это дает вывод:

Value for EMPLOYEE_ID is: 198
Value for FIRST_NAME is: Donald
Value for LAST_NAME is: OConnell
Value for EMAIL is: DOCONNEL
Value for PHONE_NUMBER is: 650.507.9833
Value for HIRE_DATE is: 21-jun-2007 00:00:00
Value for JOB_ID is: SH_CLERK
Value for SALARY is: 2600
Value for COMMISSION_PCT is: 
Value for MANAGER_ID is: 124
Value for DEPARTMENT_ID is: 50
-----------------


PL/SQL procedure successfully completed.
...