我们如何逐行打印字符并将其保存到 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

&gt;&gt; 表示法指示操作系统通过 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 子句中

如何逐行拆分scala中的文本

如何在不保存文件的情况下制作打印屏幕并将其发送到 FTP 服务器?我的工作代码将文件保存到硬盘

打印 DataGridView 而不将其转换为位图

如何逐行读取字符串[重复]

创建一个表并将其保存到Julia中的csv文件中