Oracle导出CSV到MySQL

Oracle导出CSV到MySQL

一、导出CSV

1.1 存储过程导csv

CREATE OR REPLACE PROCEDURE SQL_TO_CSV
(P_QUERY IN VARCHAR2,P_DIR IN VARCHAR2,P_FILENAME IN VARCHAR2) 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
L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
DBMS_SQL.PARSE(L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS(L_THECURSOR, L_COLCNT, L_DESCTBL);
FOR I IN 1 .. L_COLCNT LOOP
--UTL_FILE.PUT(L_OUTPUT,L_SEPARATOR || '"' || L_DESCTBL(I).COL_NAME || '"'); --display column name in csv
DBMS_SQL.DEFINE_COLUMN(L_THECURSOR, I, L_COLUMNVALUE, 4000);
L_SEPARATOR := ',';
END LOOP;
UTL_FILE.NEW_LINE(L_OUTPUT);
L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);
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;
DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
UTL_FILE.FCLOSE(L_OUTPUT);
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;

Oracle导出CSV到MySQL_第1张图片

调用存储过程:

exec sql_to_csv('sql语句','directory目录','文件名.CSV');

示例:

create directory dump as '/opt/dump';
set serveroutput on;
exec sql_to_csv('SELECT attachguid,attachfilename,contenttype,documenttype,cliengtag,cliengguid,categoryguid,tenantguid FROM frame_attachstorage where attachguid=''005a1d80-08c7-4cd1-8fc7-9a4aa739b788''','DUMP','aa.CSV');

1.2 Sql Developer导出csv

Oracle导出CSV到MySQL_第2张图片
Oracle导出CSV到MySQL_第3张图片

注意:两种方式导出的csv文件需要确保字符集为UTF-8

[root@mysql_node1 opt]# file -i xx2.csv
xx2.csv: text/plain; charset=utf-8

二、导入CSV到MySQL

1、修改my.cnf
加入此参数secure_file_priv = /opt
重启MySQL再次查看
mysql> show global variables like ‘%secure%’;
±-------------------------±------+
| Variable_name | Value |
±-------------------------±------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /opt/ |
±-------------------------±------+
3 rows in set (0.01 sec)

2、将csv文件放到/opt目录

3、创建表结构
原Oracle表结构

create table DZ_ZZ
(
  CERTIFICATE_INFORMATION_ID VARCHAR2(32) not null,
  BM_DZ_ID                   VARCHAR2(32),
  DZ_ZZ_NUM                  VARCHAR2(256),
  ZZ_NUM                     VARCHAR2(200),
  CERTIFIED_TIME             DATE,
  EFFECTIVE_STARTTIME        DATE,
  EFFECTIVE_ENDTIME          DATE,
  CERTIFIED_UNITS            VARCHAR2(100),
  HOLDER                     VARCHAR2(1000),
  HOLDER_TYPE                VARCHAR2(32),
  HOLDER_CERTIFICATE_TYPE    VARCHAR2(32),
  HOLDER_NUMBER              VARCHAR2(200),
  LICENSES_CLASSIFICATION    VARCHAR2(32),
  CREAT_TIME                 DATE,
  JHPT_UPDATE_TIME           DATE,
  STATE                      VARCHAR2(1),
  PICTURE_URL                VARCHAR2(500)
)


alter table DZ_ZZ
  add constraint CERTIFICATE_INFORMATION_ID primary key (CERTIFICATE_INFORMATION_ID)
  using index;

适配到MySQL表结构

CREATE TABLE dz_zz_test (
  certificate_information_id varchar(200)  NOT NULL,
  bm_dz_id varchar(200)  DEFAULT NULL,
  dz_zz_num varchar(256)  DEFAULT NULL,
  zz_num varchar(200)  DEFAULT NULL,
  certified_time varchar(50) DEFAULT NULL,
  effective_starttime varchar(50) DEFAULT NULL,
  effective_endtime varchar(50) DEFAULT NULL,
  certified_units varchar(200)  DEFAULT NULL,
  holder varchar(1000)  DEFAULT NULL,
  holder_type varchar(200)  DEFAULT NULL,
  holder_certificate_type varchar(200)  DEFAULT NULL,
  holder_number varchar(200)  DEFAULT NULL,
  licenses_classification varchar(200)  DEFAULT NULL,
  creat_time varchar(50) DEFAULT NULL,
  jhpt_update_time varchar(50) DEFAULT NULL,
  state varchar(1)  DEFAULT NULL,
  picture_url varchar(500)  DEFAULT NULL,
  PRIMARY KEY (certificate_information_id)
);

4、导入csv

load data infile '/opt/DZ_ZZ.csv' into table dz_zz_test 
CHARACTER SET utf8mb4 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n' 
IGNORE 1 LINES (CERTIFICATE_INFORMATION_ID,BM_DZ_ID,DZ_ZZ_NUM,ZZ_NUM,CERTIFIED_TIME,
EFFECTIVE_STARTTIME,EFFECTIVE_ENDTIME,CERTIFIED_UNITS,HOLDER,HOLDER_TYPE,
HOLDER_CERTIFICATE_TYPE,HOLDER_NUMBER,LICENSES_CLASSIFICATION,
CREAT_TIME,JHPT_UPDATE_TIME,STATE,PICTURE_URL);

备注:
1 FIELDS TERMINATED BY ','是以逗号分隔开
2 OPTIONALLY ENCLOSED BY '"' 是去掉csv文本,列字段左右两边双引号"字段名"
Oracle导出CSV到MySQL_第4张图片
3 IGNORE 1 LINES 如果csv第一行是字段名称列,可将此行忽略
4 LINES TERMINATED BY '\r\n' 是行之间的分隔,\n是新行 \r是回车

FAQ:
导入时有报错ERROR 1261 (01000):Row 1 doesn’t contain data for all colums
解决方法:
查看 MySQL 当前连接的 sql_mode

mysql> show variables like ‘sql_mode’;
临时修改sql_mode
mysql> set sql_mode=’’;

你可能感兴趣的:(迁移)