使用过程将 table 导出到 csv 文件(带时间戳的 csv 名称)
Export table to csv file by using procedure (csv name with timestamp)
我想导出一个 table 到每个 csv 文件并用时间戳命名 csv 文件。比如我有一个tablet1
,导出后生成一个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文件的名称?
有几个步骤:
- 使用 `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);
(大大简化的示例!)
创建目录后,通过 运行 验证您的工作:
- Select * 来自 ALL_DIRECTORIES;
- 你应该看到你的目录
- 登录数据库所在机器,确认文件夹路径存在且oracle用户有权限。仅当用户 运行 oracle 服务对该文件夹具有权限时才能使用网络驱动器
感谢kevin分享程序,对我很有用。我已经自定义了代码:
- 在输出的 csv 文件中添加以前不起作用的列名。
- 当我将定界符作为参数传递时,它会在每行 (,1,2,3) 的开头添加逗号,这已得到更正。
我还分享了可能对其他人有帮助的自定义代码。可下载自定义代码here.
- 添加列名的自定义代码
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);');
分隔符的自定义代码
如果我<> t_describe.LAST 那么
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 => 'Select 1 from dual',file_in => 'file.csv',directory_in => 'MY_DIR', delimiter_in => '|' );
谢谢
纳文
- 在目录中保存并复制文件{文件不需要可执行}
- 导出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
我想导出一个 table 到每个 csv 文件并用时间戳命名 csv 文件。比如我有一个tablet1
,导出后生成一个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文件的名称?
有几个步骤:
- 使用 `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);
(大大简化的示例!)
创建目录后,通过 运行 验证您的工作:
- Select * 来自 ALL_DIRECTORIES;
- 你应该看到你的目录
- 登录数据库所在机器,确认文件夹路径存在且oracle用户有权限。仅当用户 运行 oracle 服务对该文件夹具有权限时才能使用网络驱动器
感谢kevin分享程序,对我很有用。我已经自定义了代码:
- 在输出的 csv 文件中添加以前不起作用的列名。
- 当我将定界符作为参数传递时,它会在每行 (,1,2,3) 的开头添加逗号,这已得到更正。
我还分享了可能对其他人有帮助的自定义代码。可下载自定义代码here.
- 添加列名的自定义代码
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);');
分隔符的自定义代码
如果我<> t_describe.LAST 那么
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 => 'Select 1 from dual',file_in => 'file.csv',directory_in => 'MY_DIR', delimiter_in => '|' );
谢谢
纳文
- 在目录中保存并复制文件{文件不需要可执行}
- 导出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