oracle 在PL/SQL中将查询作为参数使用的过程

x8diyxa7  于 2023-02-07  发布在  Oracle
关注(0)|答案(3)|浏览(210)

我目前正在使用这段代码从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;

但在这里我面临着同样的问题,我需要使这个过程能够处理来自参数的动态查询,而不是在过程中声明查询。
我怎样才能做到这一点?

uwopmtnx

uwopmtnx1#

我没有安装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>');
drnojrws

drnojrws2#

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

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

kqqjbcuj

kqqjbcuj3#

我建议阅读下面的文章,关于从Oracle创建Excel文件的包:
Create an Excel-file with PL/SQL

相关问题