繁体   English   中英

通过使用过程将表导出到csv文件(带时间戳的csv名称)

[英]Export table to csv file by using procedure (csv name with timestamp)

我想将一个表导出到每个csv文件,并用时间戳命名该csv文件。 例如,如果我有一个表t1 ,则在导出后,将生成一个csv文件名t1.YYYYMMDDHHMISS.csv。 这是我的代码:

create or replace procedure 
T_to_CSV(Tname varchar2,Directory varchar2)

BEGIN

set colsep ,     -- separate columns with a comma
set pagesize 0   -- No header rows
set trimspool on -- remove trailing blanks
set headsep off  -- this may or may not be useful...depends on your 

spool timestamp.csv --don't know how to write in directory

select *
  from Tname

end

这是我的问题:

(1)我不知道如何将csv文件输出到需要的目录中,请如何解决假脱机代码?

我应该使用假脱机D:\\path\\filename.csv吗?

(2)在假脱机行中,如何使用时间戳now()更改csv文件的名称?

有几个步骤:

  • 创建一个目录使用`创建目录MY_DIR为“C:\\ DIR”;
  • 确保Oracle已在计算机上的文件夹上进行读写操作(最好通过在Oracle安装文件夹中创建文件夹来完成此操作)
  • 授予执行程序GRANT read,write on DIRECTORY my_dir to the_user;的用户GRANT read,write on DIRECTORY my_dir to the_user;
  • 在此处下载并编译便捷程序

我已经用过了,效果很好。

用法

data_dump ( 'Select emp_name from emp',
             CURRENT_TIMESTAMP||'filename.csv',
             my_dir);

(大大简化了示例!)

创建目录后,通过运行以下命令验证您的工作:

  • 从ALL_DIRECTORIES中选择*;
  • 你应该看到你的目录
  • 登录到数据库所在的计算机,并验证文件夹路径是否存在以及oracle用户对其具有权限。 仅当运行oracle服务的用户对该文件夹具有权限时,才可以使用网络驱动器
  • 将文件保存并复制到目录{文件不必是可执行文件}
  • 导出数据库实例的ORACLE_HOME,PATH和SID
  • 导航到该目录并执行sqlplus
  • 假脱机文件将与.sql文件创建在同一目录中

     SET COLSEP , SET HEADSEP OFF -- character used when defining a two-line column heading SET TRIMSPOOL ON -- trim trailing spaces from each line SET LINESIZE 32000 -- number of characters to be printed on one line SET WRAP OFF -- truncates lines longer than LINESIZE SET NUMWIDTH 5 -- default width while displaying numbers COLUMN tm new_value iso8601 noprint SELECT to_char(sysdate, 'YYYY-MM-DD') tm FROM dual; spool output_file_&iso8601..csv -- Append new data to spool file: "spool output_file_&iso8601..csv append" SELECT * FROM table_name spool OFF 

感谢kevin分享了该过程,这对我非常有用。 我已自定义代码:

  1. 要在输出csv文件中添加以前不起作用的列名。
  2. 当我将定界符作为参数传递时,它将在已更正的每行(,1,2,3)的开头添加逗号。

我还分享了可能对他人有帮助的自定义代码。 定制代码可在此处下载。

  1. 自定义代码以添加列名
  FOR i IN t_describe.FIRST .. t_describe.LAST LOOP IF i <> t_describe.LAST THEN put('UTL_FILE.PUT(v_fh,'''||t_describe(i).col_name||'''||'''||v_delimiter||''');'); ELSE put(' UTL_FILE.PUT(v_fh,'''||t_describe(i).col_name||''');'); END IF; END LOOP; put(' UTL_FILE.NEW_LINE(v_fh);'); 
  1. 分隔符的定制代码

    如果我<> t_describe.LAST THEN
    put('UTL_FILE.PUT(v_fh,“'|| t_describe(i).col_name ||'”(i)||''|| v_delimiter ||'');');;
    其他
    put('UTL_FILE.PUT(v_fh,“'|| t_describe(i).col_name ||'”(i));');
    万一;

调用该过程的正确方法是将变量与值绑定

data_dump(query_in =>'从对偶中选择1',file_in =>'file.csv',directory_in =>'MY_DIR',delimiter_in =>'|');

谢谢

纳文

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM