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;
调用存储过程:
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');
注意:两种方式导出的csv文件需要确保字符集为UTF-8
[root@mysql_node1 opt]# file -i xx2.csv
xx2.csv: text/plain; charset=utf-8
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文本,列字段左右两边双引号"字段名"
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=’’;