Процедура работы с запросом в качестве параметра в PL / SQL - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время я использую этот код для создания файла XLS из запроса в Oracle PL / SQL, сохраняя файл с тегами HTML, используя этот код.

CREATE OR REPLACE PROCEDURE GENERATE_XLS(querie VARCHAR2) IS
v_file               VARCHAR2 (20)            := 'TEST-EXCEL.xls';
v_directory            VARCHAR2 (60)            := 'C:\';
p_write                LIB_FILES.file_type;
v_sql varchar2(32767) := 'SELECT LASTNAME, NAME, ID
                                FROM DUAL';
header VARCHAR(1000) := '<html> <head><center><B><U> TEST XLS  </U></B></center>
    <table></tr><tr><th>LASTNAME</th><th>NAME</th><th>ID</th></tr>';
BEGIN    
    p_write := LIB_FILES.fopen (v_directory, v_file, 'W');
    LIB_FILES.put_line (p_write, header);
    FOR REGISTRY IN querie LOOP
        LIB_FILES.put_line (p_write,'<tr><td>'||REGISTRY.LASTNAME||'</td><td>'||REGISTRY.NAME||'</td><td>'||REGISTRY.ID||'</td></tr>');
    END LOOP;
    LIB_FILES.put_line (p_write,'</table>');
    LIB_FILES.fflush (p_write);
    LIB_FILES.fclose (p_write);        
END;

Это работает прямо сейчас, но мне нужно добавить в эту процедуру параметр, который является запросом SQL, а затем сгенерировать файл на основе запроса

В настоящее время я использую этот код, чтобы получить имя столбца

CREATE OR REPLACE PROCEDURE GET_COLUMNS IS        
    v_cursor_id integer;    
    v_col_cnt integer;
    v_columns dbms_sql.desc_tab;    
    v_sql varchar2(3000) :='SELECT LASTNAME, NAME, ID FROM DUAL';
    header VARCHAR(1000):='<html> <head><center><B><U> TEST XLS  </U></B></center>
    <table></tr><tr>';
begin    
    v_cursor_id := dbms_sql.open_cursor;
    dbms_sql.parse(v_cursor_id, v_sql, dbms_sql.native);
    dbms_sql.describe_columns(v_cursor_id, v_col_cnt, v_columns);
    for i in 1 .. v_columns.count loop
        header := header || '<th>'|| v_columns(i).col_name ||'</th>';        
    end loop;
    header := header || '</tr>';

    dbms_sql.close_cursor(v_cursor_id);
exception when others then
    dbms_sql.close_cursor(v_cursor_id);
    raise;
end;

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

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Если вы задаете запрос как курсор ссылки вместо строки, например,

open your_refcursor for select * from dual;

, затем вы можете преобразовать его в идентификатор курсора dbms_sql, используя

v_cursor_id := dbms_sql.to_cursor_number(your_refcursor);

Вот один, который я написал ранее:

http://www.williamrobertson.net/documents/refcursor-to-csv.shtml

0 голосов
/ 04 мая 2018

У меня не установлен оракул, насколько я знаю, я дал эти данные ... проверить и проверить это

CREATE OR REPLACE PROCEDURE GET_COLUMNS (p_sql IN VARCHAR2 , p_header IN VARCHAR2)

IS        
    v_cursor_id integer;    
    v_col_cnt integer;
    v_columns dbms_sql.desc_tab;    
    v_sql varchar2(3000) := p_sql;
    header VARCHAR(1000):= p_header;
begin    
    v_cursor_id := dbms_sql.open_cursor;
    dbms_sql.parse(v_cursor_id, v_sql, dbms_sql.native);
    dbms_sql.describe_columns(v_cursor_id, v_col_cnt, v_columns);
    for i in 1 .. v_columns.count loop
        header := header || '<th>'|| v_columns(i).col_name ||'</th>';        
    end loop;
    header := header || '</tr>';

    dbms_sql.close_cursor(v_cursor_id);
exception when others then
    dbms_sql.close_cursor(v_cursor_id);
    raise;
end;

To execute 

Execute GET_COLUMNS ('SELECT LASTNAME, NAME, ID FROM DUAL','<html> <head><center><B><U> TEST XLS  </U></B></center>
    <table></tr><tr>');
0 голосов
/ 04 мая 2018

Предлагаю прочитать следующую статью о пакете для создания файлов Excel из Oracle:

Создание Excel-файла с PL / SQL

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