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

汤姆

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

但在这里我面临同样的问题,我需要使这个过程与来自参数的动态查询一起工作,而不是在过程中声明查询。

我怎样才能做到这一点?

卡纳加拉吉

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Java调用PLSQL过程

来自分类Dev

PLSQL 过程逻辑

来自分类Dev

C#中的PLSQL过程参数

来自分类Dev

在PreparedStatement中使用PLSQL块

来自分类Dev

在plsql中使用for循环更新

来自分类Dev

在plsql varray中使用对象

来自分类Dev

游标plsql使用select

来自分类Dev

将表名作为plsql参数传递

来自分类Dev

将表名作为plsql参数传递

来自分类Dev

PLSQL中多个参数的逗号分隔查询

来自分类Dev

在基于FOR LOOP的SQL查询中使用PLSQL变量

来自分类Dev

如何在 sql 查询中使用 plsql 表类型?

来自分类Dev

在 plsql for 循环中使用内部联接选择查询失败

来自分类Dev

plsql 存储过程,输入参数 date_of_birth 作为 varchar 'DD-MM-YYYY' 格式

来自分类Dev

PLSQL:如果变量IN子查询

来自分类Dev

PLSQL递归查询好友分析

来自分类Dev

在 plsql 中参数为空时使用

来自分类Dev

在plsql中使用游标更新多个记录

来自分类Dev

使用plsql获取表信息

来自分类Dev

使用控制语句的plsql程序

来自分类Dev

PLSQL过程查询两个表并遍历结果

来自分类Dev

Plsql 使用自定义类型作为表运行存储过程

来自分类Dev

从plsql选择过程中检索值

来自分类Dev

在PLSQL过程中获取输出

来自分类Dev

从过程PLSQL检索用户定义的记录

来自分类Dev

过程PLSQL中的2条合并语句

来自分类Dev

从plsql选择过程中检索值

来自分类Dev

在存储过程plsql中创建目录

来自分类Dev

从过程PLSQL检索用户定义的记录