我目前正在使用这段代码从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条答案
按热度按时间uwopmtnx1#
我没有安装oracle,据我所知,我提供了这些详细信息...请检查并验证
drnojrws2#
如果将查询定义为引用游标而不是字符串,例如
则可以使用以下命令将其转换为dbms_sql游标ID
下面是我之前写的一个例子:
http://www.williamrobertson.net/documents/refcursor-to-csv.shtml
kqqjbcuj3#
我建议阅读下面的文章,关于从Oracle创建Excel文件的包:
Create an Excel-file with PL/SQL