如何使用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 上测试这两个查询来查看结果更容易理解!