编写用于创建 CSV 或文本类型文件输出的 Oracle SQL 查询脚本
考虑从 SQL Plus 会话运行它并使用SPOOL 命令。随后的 SQL 命令的所有输出都将写入您指定的文件名。
如果您需要在每次连续运行 SQL 命令时附加结果,那么在调用 PL/SQL 的这个 sqlplus 可执行块时,操作系统级别的命令会正常工作:
此脚本的文件名为:“sample_csv_out.sql”
DECLARE
v_total_columns constant number:= 3; -- Number of columns queried
v_column_counter number;
v_csv_record varchar2(1000);
c_csv_column_format constant varchar2(15):=
'<<COLUMN1_VAL>>,<<COLUMN2_VAL>>,<<COLUMN3_VAL>>';
cursor result_cur is
SELECT column1, column2, column3
FROM tablea
WHERE column1 = ... ;
BEGIN
v_csv_record:= 'COLUMN1,COLUMN2,COLUMN3';
dbms_output.put_line (v_csv_record);
FOR i in result_cur LOOP
v_csv_record:= replace(c_csv_column_format, '<<COLUMN1_VAL>>', i.column1);
v_csv_record:= replace(v_csv_record, '<<COLUMN2_VAL>>', i.column2);
v_csv_record:= replace(c_csv_record, '<<COLUMN3_VAL>>', i.column3);
dbms_output.put_line(v_csv_record);
END LOOP;
END;
因此,例如在 WINDOWS O/S 环境中,将输出附加到特定文件名的调用将是:
C:\> sqlplus sample_csv_out.sql >> mycsv_out.csv
>> 表示法指示操作系统通过 sqlplus 会话通过管道传输运行 sample_csv_out.sql 的输出。
命令DBMS_OUTPUT 完成其余的工作。如果您需要更多详细信息,请查看更多Oracle documentation on DBMS_OUTPUT。
评论:我选择了RECORD STRING TEMPLATE 方法来使这个脚本更加灵活和可重用。我建议在CURSOR 语句中保留任何数据操作逻辑。通常,当这两者混合在一起时,调试一长串值中的任何语法拼写错误会变得更加困难。
输出记录的构造还旨在减少拼写错误和挫败感...如果您自己的脚本中有超过 3 列,则向输出字符串添加另一个元素主要是剪切和粘贴操作. “标题”行(列标题)也是如此。