Oracle、MySQL 数据导出到CSV方法对比

图片.png

MySQL 数据库

版本:8.0.37

MySQL 将数据导出到CSV

mysql> create database cjc;
mysql> use cjc;
create table t1 (id int,name varchar(10),poetry varchar(30),primary key(id));
insert into t1 values(1,'a','别人笑我太疯癫,');
insert into t1 values(2,'b','我笑他人看不穿,');
insert into t1 values(3,'c','不见五陵豪杰墓,');
insert into t1 values(4,'d','无花无酒锄作田。');

mysql> select * from t1;
+----+------+--------------------------+
| id | name | poetry                   |
+----+------+--------------------------+
|  1 | a    | 别人笑我太疯癫,         |
|  2 | b    | 我笑他人看不穿,         |
|  3 | c    | 不见五陵豪杰墓,         |
|  4 | d    | 无花无酒锄作田。         |
+----+------+--------------------------+
4 rows in set (0.00 sec)

检查参数

mysql> show variables like 'secure%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /mysqldata/3308/file/ |
+------------------+-----------------------+
1 row in set (0.00 sec)

导出

select id,name,poetry 
INTO OUTFILE '/mysqldata/3308/file/t1.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' 
from t1;
Query OK, 4 rows affected (0.00 sec)

默认没有表头

[mysql@cjc-db-01 file]$ cat t1.csv 
"1","a","别人笑我太疯癫,"
"2","b","我笑他人看不穿,"
"3","c","不见五陵豪杰墓,"
"4","d","无花无酒锄作田。"

添加表头

select 'id','name','poetry'
union all
select id,name,poetry 
INTO OUTFILE '/mysqldata/3308/file/t1_01.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' 
from t1;
Query OK, 5 rows affected, 1 warning (0.29 sec)
[mysql@cjc-db-01 file]$ cat t1_01.csv 
"id","name","poetry"
"1","a","别人笑我太疯癫,"
"2","b","我笑他人看不穿,"
"3","c","不见五陵豪杰墓,"
"4","d","无花无酒锄作田。"

查看csv文件
图片.png

MySQL 导入CSV

mysql> create table t2 like t1;
mysql> show variables like 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

修改参数

set global local_infile=ON;

导入

[mysql@cjc-db-01 socket]$ mysql -ucjc -p --socket=/mysqldata/3308/socket/mysql.sock --local-infile
mysql> use cjc;
LOAD DATA LOCAL INFILE '/mysqldata/3308/file/t1.csv'
INTO TABLE t2
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 0 LINES;

Query OK, 4 rows affected (0.32 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

查看数据

mysql> select * from t2;
+----+------+--------------------------+
| id | name | poetry                   |
+----+------+--------------------------+
|  1 | a    | 别人笑我太疯癫,         |
|  2 | b    | 我笑他人看不穿,         |
|  3 | c    | 不见五陵豪杰墓,         |
|  4 | d    | 无花无酒锄作田。         |
+----+------+--------------------------+
4 rows in set (0.00 sec)

Oracle 数据库

版本:11.2.0.4.0

Oracle 将数据导出到CSV

sqlplus cjc/******
create table t1 (id int,name varchar(10),poetry varchar(30),primary key(id));
insert into t1 values(1,'a','别人笑我太疯癫,');
insert into t1 values(2,'b','我笑他人看不穿,');
insert into t1 values(3,'c','不见五陵豪杰墓,');
insert into t1 values(4,'d','无花无酒锄作田。');
commit;
SQL> select * from t1;

	ID NAME       POETRY
---------- ---------- ------------------------------
         1 a          别人笑我太疯癫,
         2 b          我笑他人看不穿,
         3 c          不见五陵豪杰墓,
         4 d          无花无酒锄作田。

导出 t1 表到 CSV

方法一:使用||连接

SQL> SELECT '"'||ID||'"'||','||'"'||NAME||'"'||','||'"'||POETRY||'"' CSV FROM T1;

CSV
--------------------------------------------------------------------------------
"1","a","别人笑我太疯癫,"
"2","b","我笑他人看不穿,"
"3","c","不见五陵豪杰墓,"
"4","d","无花无酒锄作田。"

添加表头

SELECT '"'||'ID'||'"'||','||'"'||'NAME'||'"'||','||'"'||'POETRY'||'"' CSV FROM DUAL
UNION ALL
SELECT '"'||ID||'"'||','||'"'||NAME||'"'||','||'"'||POETRY||'"' CSV FROM T1;

CSV
--------------------------------------------------------------------------------
"ID","NAME","POETRY"
"1","a","别人笑我太疯癫,"
"2","b","我笑他人看不穿,"
"3","c","不见五陵豪杰墓,"
"4","d","无花无酒锄作田。"

导出到文件

set heading off
spool /home/oracle/t1.csv
SELECT '"'||'ID'||'"'||','||'"'||'NAME'||'"'||','||'"'||'POETRY'||'"' CSV FROM DUAL
UNION ALL
SELECT '"'||ID||'"'||','||'"'||NAME||'"'||','||'"'||POETRY||'"' CSV FROM T1;
exit;

编辑文件,去掉开头SQL语句和结尾exit等部分

vi /home/oracle/t1.csv

查看最终文件

cat /home/oracle/t1.csv
"ID","NAME","POETRY"                                                            
"1","a","别人笑我太疯癫,"                                                           
"2","b","我笑他人看不穿,"                                                          
"3","c","不见五陵豪杰墓,"                                                          
"4","d","无花无酒锄作田。"  

方法二:使用自定义存储过程

说明:下面内容参考自:
捉到一只萤火虫—《oracle导出数据到 csv文件方法整理》

https://blog.csdn.net/qq_34902590/article/details/81777900

创建导出目录

select * from dba_directories;
create or replace directory cjc_dir as '/home/oracle/tmp';
grant read,write,execute on directory cjc_dir to cjc;

创建存储过程:

CREATE OR REPLACE PROCEDURE SQL_TO_CSV
(
 P_QUERY IN VARCHAR2, -- PLSQL文
 P_DIR IN VARCHAR2, -- 导出的文件放置目录
 P_FILENAME IN VARCHAR2 -- CSV名
 )
 IS
  L_OUTPUT UTL_FILE.FILE_TYPE;
  L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
  L_COLUMNVALUE VARCHAR2(4000);
  L_STATUS INTEGER;
  L_COLCNT NUMBER := 0;
  L_SEPARATOR VARCHAR2(1);
  L_DESCTBL DBMS_SQL.DESC_TAB;
  P_MAX_LINESIZE NUMBER := 32000;
BEGIN
  --OPEN FILE
  L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);
  --DEFINE DATE FORMAT
  EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
  --OPEN CURSOR
  DBMS_SQL.PARSE(L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);
  DBMS_SQL.DESCRIBE_COLUMNS(L_THECURSOR, L_COLCNT, L_DESCTBL);
  --DUMP TABLE COLUMN NAME
  FOR I IN 1 .. L_COLCNT LOOP
    UTL_FILE.PUT(L_OUTPUT,L_SEPARATOR || '"' || L_DESCTBL(I).COL_NAME || '"'); --输出表字段
    DBMS_SQL.DEFINE_COLUMN(L_THECURSOR, I, L_COLUMNVALUE, 4000);
    L_SEPARATOR := ',';
  END LOOP;
  UTL_FILE.NEW_LINE(L_OUTPUT); --输出表字段
  --EXECUTE THE QUERY STATEMENT
  L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);
 
  --DUMP TABLE COLUMN VALUE
  WHILE (DBMS_SQL.FETCH_ROWS(L_THECURSOR) > 0) LOOP
    L_SEPARATOR := '';
    FOR I IN 1 .. L_COLCNT LOOP
      DBMS_SQL.COLUMN_VALUE(L_THECURSOR, I, L_COLUMNVALUE);
      UTL_FILE.PUT(L_OUTPUT,
                  L_SEPARATOR || '"' ||
                  TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE, '"', '""')) || '"');
      L_SEPARATOR := ',';
    END LOOP;
    UTL_FILE.NEW_LINE(L_OUTPUT);
  END LOOP;
  --CLOSE CURSOR
  DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
  --CLOSE FILE
  UTL_FILE.FCLOSE(L_OUTPUT);
EXCEPTION
  WHEN OTHERS THEN
    RAISE;
END;
/

导出

SQL> EXEC SQL_TO_CSV('SELECT ID,NAME,POETRY FROM CJC.T1','CJC_DIR','T1_01.CSV');
PL/SQL procedure successfully completed.

查看导出数据:

[oracle@cjc-db-01 tmp]$ cat T1_01.CSV 
"ID","NAME","POETRY"
"1","a","别人笑我太疯癫,"
"2","b","我笑他人看不穿,"
"3","c","不见五陵豪杰墓,"
"4","d","无花无酒锄作田。"

导入CSV

vi t1.ctl
LOAD DATA
CHARACTERSET UTF8          
INFILE 'T1_01.CSV' 
BADFILE 't.bad'
DISCARDFILE 't.dsc'
INTO TABLE t3
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(ID,NAME,POETRY)
sqlplus cjc/******
create table t3 as select * from t1 where 1=2;
alter table t3 modify poetry varchar2(50);
select * from t3;

导入

[oracle@cjc-db-01 tmp]$ sqlldr userid=cjc/a control=/home/oracle/tmp/t1.ctl log=/home/oracle/tmp/t1.log

SQL*Loader: Release 11.2.0.4.0 - Production on Sat Jul 20 13:51:13 2024

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 5

乱码了?

SQL> select * from t3;

	ID NAME       POETRY
---------- ---------- --------------------------------------------------
         1 a          锟斤拷锟叫?拷太锟斤拷锟斤拷
         2 b          锟叫?拷锟斤拷锟斤拷锟斤拷锟斤拷锟
         3 c          锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
         4 d          锟斤拷锟斤拷锟狡筹拷锟斤拷锟斤拷

总结:
可以看到,不使用图形化工具的前提下,MySQL更容易实现CSV的导出等操作。
参考:
捉到一只萤火虫—《oracle导出数据到 csv文件方法整理》

https://blog.csdn.net/qq_34902590/article/details/81777900

###chenjuchao 20240720###
欢迎关注我的公众号《IT小Chen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值