使用查询作为PL / SQL

时间:2018-05-04 13:24:27

标签: oracle plsql

我目前正在使用此代码从Oracle PL / SQL中的查询生成XLS文件,使用此代码保存带有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 :(得分:1)

如果将查询定义为引用游标而不是字符串,例如

open your_refcursor for select * from dual;

然后您可以使用

将其转换为dbms_sql游标ID
v_cursor_id := dbms_sql.to_cursor_number(your_refcursor);

这是我之前写的:

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

答案 1 :(得分:1)

我没有安装oracle,据我所知,我提供了这些细节......检查并验证这个

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>');

答案 2 :(得分:0)

我建议阅读以下文章,关于从Oracle创建Excel文件的包:

Create an Excel-file with PL/SQL