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

时间:2015-04-01 19:31:38

标签: sql oracle stored-procedures

我想将一个表导出到每个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文件输出到requried目录中,请问如何修复假脱机代码?

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

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

3 个答案:

答案 0 :(得分:5)

有几个步骤:

  • 使用`CREATE DIRECTORY my_dir' C:\ dir';
  • 创建directory
  • 确保Oracle已读取,写入计算机上的文件夹(最好通过在Oracle安装文件夹中创建)
  • 授予用户执行过程GRANT read,write on DIRECTORY my_dir to the_user;
  • 下载并编译方便的程序here

我已经使用了它并且效果非常好。

用法

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

(大大简化的样本!)

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

  • 从ALL_DIRECTORIES中选择*;
  • 你应该看到你的目录
  • 登录到数据库所在的计算机,并验证文件夹路径是否存在,并且oracle用户对其具有权限。只有运行oracle服务的用户具有该文件夹的权限
  • ,才能使用网络驱动器

答案 1 :(得分:0)

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

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

我还分享了可能对他人有帮助的自定义代码。可以下载here自定义代码。

  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 ||'');');
        ELSE
        put('UTL_FILE.PUT(v_fh,“'|| t_describe(i).col_name ||'”(i));');
        END IF;

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

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

谢谢

Naveen

答案 2 :(得分:0)

  • 将文件保存并复制到目录{文件无需可执行文件}
  • 导出数据库实例的ORACLE_HOME,PATH和SID
  • 导航到该目录并执行sqlplus
  • 假脱机文件将与.sql文件创建在同一目录中

    def change():
        root.children[str(s.get())].configure(text="Changed")