我们如何逐行打印字符并将其保存到 PLSQL 中的 csv 或文本文件
Posted
技术标签:
【中文标题】我们如何逐行打印字符并将其保存到 PLSQL 中的 csv 或文本文件【英文标题】:How do we print characters line by line and save it to csv or text file in PLSQL 【发布时间】:2014-04-04 10:34:29 【问题描述】:-
声明
V_NUMBER NUMBER :=23;
开始
循环
V_NUMBER:=V_NUMBER+1;
当 V_NUMBER:=25 时退出;
--应用于打印和嵌套行到 CSV 或 TEXT 文件中的某种函数。
结束循环;
提交;
结束;
【问题讨论】:
请添加有关该问题的更多详细信息,例如应写入哪种数据,这是临时作业还是要安排的作业? 好吧,我只是想在重新运行同一个块后将数据打印到 25 行,它应该从第 26 行开始,不,它既不是临时作业也不是要安排的作业。谢谢 【参考方案1】:编写用于创建 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 列,则向输出字符串添加另一个元素主要是剪切和粘贴操作. “标题”行(列标题)也是如此。
【讨论】:
【参考方案2】:您可以使用 UTIL_FILE 包在 PL/SQL 中读写文件
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm
【讨论】:
是的,我知道 utl_file 包将被使用......但是它将如何保存,所以下次我运行它应该继续最后一行,即“文件结尾”。 如果您知道 UTIL_FILE 包,那么您应该也知道打开文件时有一个append
模式。以上是关于我们如何逐行打印字符并将其保存到 PLSQL 中的 csv 或文本文件的主要内容,如果未能解决你的问题,请参考以下文章
将另一个表中的逐行值转换为字符串并将其插入到 SQL 中的 NOT IN 子句中