我需要替换当前在SQL Developer中创建过程的过程,以将查询的输出写入CSV,而代码将改为输出.xlsx文件。我已经对该主题进行了一些粗略的研究,但答案似乎超出了我的脑海。
我试图模仿我在google / stack上发现的解决方案,但无济于事。
CSV程序示例:
create or replace PROCEDURE EXAMPLE_FILE_CSV AS
CURSOR c_data IS
‘QUERY HERE’;
v_file UTL_FILE.FILE_TYPE;
BEGIN
v_file := UTL_FILE.FOPEN(location => 'EXTRACT_DIR',
filename => 'EXAMPLE_FILE.CSV',
open_mode => 'w',
max_linesize => 32767);
FOR cur_rec IN c_data LOOP
UTL_FILE.PUT_LINE(v_file,
cur_rec.COL1 || ',' ||
cur_rec.COL2 || ',' ||
cur_rec.COL3 || ',' ||
cur_rec.COL4 || ',' ||
cur_rec.COL5 || ',' ||
cur_rec.COL6 ;
END LOOP;
UTL_FILE.FCLOSE(v_file);
EXCEPTION
WHEN OTHERS THEN
UTL_FILE.FCLOSE(v_file);
RAISE;
END;
答案 0 :(得分:0)
您提供的示例代码使用UTL_FILE,该文件只能访问/创建Oracle服务器上的文件。
由于您提到您当前正在手动运行查询,然后将其复制/粘贴到Excel中,因此UTL_FILE选项不会为您提供帮助。
现在,要将这种查询数据放入本地/客户端文件,此方法可能会让您入门-编写一个在SQLPlus / SQLDeveloper中运行并输出 CSV 文件的脚本,使用以下命令:模板/示例。 XLSX格式比较复杂。
myscript.sql:
SET LINES 2000
SET PAGES 0
SET TRIMSPOOL ON
SPOOL the_output.csv
SELECT col1 || ',' ||
col2 || ',' ||
col3 || ',' ||
col4 || ',' ||
col5 || ',' ||
col6
FROM the_table
WHERE ...;
SPOOL OFF
您还有另一个选择是使用DBMS_OUTPUT.PUT_LINE,如下所示:
create or replace PROCEDURE EXAMPLE_FILE_CSV AS
CURSOR c_data IS
SELECT col1,
col2,
col3,
col4,
col5,
col6
FROM the_table
WHERE ...;
BEGIN
FOR cur_rec IN c_data LOOP
DMBS_OUTPUT.PUT_LINE(
cur_rec.COL1 || ',' ||
cur_rec.COL2 || ',' ||
cur_rec.COL3 || ',' ||
cur_rec.COL4 || ',' ||
cur_rec.COL5 || ',' ||
cur_rec.COL6 ;
END LOOP;
END;
/
要调用此功能,您可以在调用者脚本中执行以下操作:
SET SERVEROUTPUT ON
SET VERIFY OFF
SET LINES 2000
SET TRIMSPOOL OFF
SPOOL the_output.csv
EXEC EXAMPLE_FILE_CSV;
SPOOL OFF;
答案 1 :(得分:0)
通过plsql使用'xls'编码,上述要求是可行的。 简而言之-我们根据需要使用plsql生成xls编码,并将其作为excel文件保存。
生成Excel文件的基本xls编码:
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<Cell><Data ss:Type="String">cell data</Data></Cell>
.........
</Row>
........
</Table>
</Worksheet>
......
</Workbook>
该方法是根据数据库中的值生成编码。
示例:
考虑表格:
ROLL_NO NAME AGE
01 student no 1 15
下面的plsql代码将为此表记录生成excel工作表
declare
cursor c1 is select * from student_tbl;
l_xls_code varchar2(4000);
begin
l_xls_code:= CHR(60)||'?xml version='||CHR(34)||'1.0'||CHR(34)||'?'||CHR(62)||CHR(12)||
CHR(60)||'Workbook xmlns='||CHR(34)||'urn:schemas-microsoft-com:office:spreadsheet'||CHR(34)||'
xmlns:o='||CHR(34)||'urn:schemas-microsoft-com:office:office'||CHR(34)||'
xmlns:x='||CHR(34)||'urn:schemas-microsoft-com:office:excel'||CHR(34)||'
xmlns:ss='||CHR(34)||'urn:schemas-microsoft-com:office:spreadsheet'||CHR(34)||'
xmlns:html='||CHR(34)||'http://www.w3.org/TR/REC-html40'||CHR(34)|| CHR(62) ||
CHR(60)||'Worksheet ss:Name='||CHR(34)||'Student Data'||CHR(34)|| CHR(62) ||
CHR(60)||'Table'|| CHR(62)||
CHR(60)||'Row'|| CHR(62)||
CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||'Roll No.'||CHR(60)||'/Data'|| CHR(62)|| CHR(60)||'/Cell'|| CHR(62) ||
CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||'Name'||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'|| CHR(62) ||
CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||'Age'||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'||CHR(62) ||
CHR(60) ||'/Row'|| CHR(62);
-- dynamically having values from the table into the excel sheet
For rec in c1
loop
l_xls_code:= l_xls_code||
CHR(60)||'Row'|| CHR(62)||
CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||rec.roll_no||CHR(60)||'/Data'|| CHR(62)|| CHR(60)||'/Cell'|| CHR(62) ||
CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||rec.name||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'|| CHR(62) ||
CHR(60)||'Cell'|| CHR(62)||CHR(60)||'Data ss:Type='||CHR(34)||'String'||CHR(34)|| CHR(62)||rec.age||CHR(60)||'/Data'|| CHR(62)||CHR(60)||'/Cell'||CHR(62) ||
CHR(60) ||'/Row'|| CHR(62);
end loop;
l_xls_code:= l_xls_code|| CHR(60)||'/Table'||CHR(62) ||
CHR(60)||'/Worksheet'||CHR(62)||
CHR(60)||'/Workbook'||CHR(62);
dbms_output.put_line(l_xls_code);
end;
上面的代码显示输出。这将是可以以'.xls'格式存储在文件中的xml编码 只能通过excel工作表打开
此文件将包含表中的数据。 在上述示例中,数据是通过游标获取的,并用于动态生成代码。 以类似的方式,可以通过plsql动态定义字体,单元格颜色,单元格宽度等样式,并可以根据需要将其编码到文件中。
通常,此变量将是clob,lob变量(在实时场景中,此xml编码会很大),可以作为附件发送,也可以在服务器位置创建文件。
类似的方法可以通过UNIX脚本完成-使sql会话根据需要生成xls编码,并将其后台处理到文件中