如何使用sqlplus将oracle中任何给定的table输出到csv
how to output any given table in oracle to csv using sqlplus
我想要一种使用 sql*plus 将 oracle 11g 中的任何给定 table 动态导出到 csv 的方法 - 而不是每次都需要显式硬编码列名。
请使用以下语法。
SET MARKUP HTML ON SPOOL ON
HEAD "<title>Data Extract</title> - <meta http-equiv='Content-Type' content='application/vnd.ms-excel;'>
<style type='text/css'>
</style>"
SET ECHO OFF
SPOOL output.xls
select * from &tablename ;
spool off
exit
出现提示时输入表名。
阿比
您可以使用 SET Colsep 选项。
SET COLSEP ","
SET PAGES 0
SET FEEDBACK OFF
SPOOL output.csv
select * from HR.employees;
spool off
exit
在搜索堆栈溢出后,我找不到这个问题的确切答案 - 因此我开发了自己的解决方案。
这是我写的 sql 脚本:
SET echo off
SET verify off
SET heading off
SET pages 50000
SET feedback off
SET newpage none
SET termout off
SET linesize 900
SET trimspool on
SET serveroutput on
define table_name = &1
define spool_path = &2
var rc refcursor
column qry new_val capture
SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry
FROM user_tab_cols
WHERE table_name = '&table_name';
spool &spool_path
SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_id)
FROM user_tab_cols
WHERE table_name = '&table_name';
BEGIN
FOR v_rec IN (&capture) LOOP
dbms_output.put_line(v_rec.rec);
END LOOP;
END;
/
spool off
EXIT
脚本需要两个参数 - 第一个参数是 table 名称,第二个是假脱机路径。
本质上是第一个查询:
SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry
FROM user_tab_cols
WHERE table_name = '&table_name';
动态创建一个新的 select 语句(加载到 &capture 替换变量中)使用 user_tab_cols 和 listagg 强制每个列名到一行 - 这是动态创建的 select语句基本上将每一列连接在一起,用逗号分隔。稍后当我们假脱机时,我们循环通过动态生成的 select 语句来生成每一行数据。
header 由类似的查询生成(我们开始假脱机后的第一个操作),但是为此我们可以直接将列 header 名称列在一起。
通过在您选择的 table 上测试这两个查询来查看结果更容易理解!
我想要一种使用 sql*plus 将 oracle 11g 中的任何给定 table 动态导出到 csv 的方法 - 而不是每次都需要显式硬编码列名。
请使用以下语法。
SET MARKUP HTML ON SPOOL ON
HEAD "<title>Data Extract</title> - <meta http-equiv='Content-Type' content='application/vnd.ms-excel;'>
<style type='text/css'>
</style>"
SET ECHO OFF
SPOOL output.xls
select * from &tablename ;
spool off
exit
出现提示时输入表名。
阿比
您可以使用 SET Colsep 选项。
SET COLSEP ","
SET PAGES 0
SET FEEDBACK OFF
SPOOL output.csv
select * from HR.employees;
spool off
exit
在搜索堆栈溢出后,我找不到这个问题的确切答案 - 因此我开发了自己的解决方案。
这是我写的 sql 脚本:
SET echo off
SET verify off
SET heading off
SET pages 50000
SET feedback off
SET newpage none
SET termout off
SET linesize 900
SET trimspool on
SET serveroutput on
define table_name = &1
define spool_path = &2
var rc refcursor
column qry new_val capture
SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry
FROM user_tab_cols
WHERE table_name = '&table_name';
spool &spool_path
SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_id)
FROM user_tab_cols
WHERE table_name = '&table_name';
BEGIN
FOR v_rec IN (&capture) LOOP
dbms_output.put_line(v_rec.rec);
END LOOP;
END;
/
spool off
EXIT
脚本需要两个参数 - 第一个参数是 table 名称,第二个是假脱机路径。
本质上是第一个查询:
SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry
FROM user_tab_cols
WHERE table_name = '&table_name';
动态创建一个新的 select 语句(加载到 &capture 替换变量中)使用 user_tab_cols 和 listagg 强制每个列名到一行 - 这是动态创建的 select语句基本上将每一列连接在一起,用逗号分隔。稍后当我们假脱机时,我们循环通过动态生成的 select 语句来生成每一行数据。
header 由类似的查询生成(我们开始假脱机后的第一个操作),但是为此我们可以直接将列 header 名称列在一起。
通过在您选择的 table 上测试这两个查询来查看结果更容易理解!