使用SQL*Plus生产CSV格式数据
#工程师培训
#sqlplus#
因为Excel、很多BI工具、甚至一些数据库,都支持直接导入CSV(comma separated value)格式数据,所以一直以来,我们都有将Oracle数据库中表的数据行导出成为CSV格式的需求。从Oracle 12.2.0.1开始,SQL*Plus支持将查询输出为CSV格式。本文对此新特性进行演示。
演示环境
[SQL*Plus] CREATE TABLE BOOKS (
BOOK_ID NUMBER GENERATED ALWAYS AS IDENTITY,
TITLE VARCHAR2(250) NOT NULL,
PAGES NUMBER NOT NULL,
AUTHOR VARCHAR2(250) NOT NULL,
CONDITION VARCHAR2(4000),
CONSTRAINT BOOKS_PK PRIMARY KEY (BOOK_ID),
CONSTRAINT BOOKS_UQ UNIQUE (TITLE)
);
[SQL*Plus] INSERT INTO BOOKS (TITLE, PAGES, AUTHOR, CONDITION) VALUES ('The Hobbit', 322, 'J. R. R. Tolkien', 'Good condition');
[SQL*Plus] INSERT INTO BOOKS (TITLE, PAGES, AUTHOR, CONDITION) VALUES ('Harry Potter and the Philosopher''s Stone', 324, 'J.K. Rowling', 'New');
[SQL*Plus] INSERT INTO BOOKS (TITLE, PAGES, AUTHOR, CONDITION) VALUES (‘The Holy Bible’, 1328, ‘Crossway Bibles’, ‘Good condition, but “mandatory” pages are missing’);
使用新特性
Oracle 12.2.0.1 SQL*Plus中,SET命令引入了新的 MARKUP CSV用法:
[SQL*Plus] SET MARK[UP] CSV {ON|OFF} DELIMI[TER] character QUOTE {ON|OFF}
- DELIMITER 默认是逗号(,),也可以指定为你希望的字符
- QUOTE 默认为OFF,打开此选项,列的输出值会用双引号(“)包围,如果值内部本身有双引号,会被Escape(“”)。如果值不是字符类型的,不会用引用QUOTE。
测试
使用QUOTE
[SQL*Plus] SET MARKUP CSV ON QUOTE ON
[SQL*Plus] SELECT * FROM BOOKS;
“BOOK_ID”,”TITLE”,”PAGES”,”AUTHOR”,”CONDITION”
1,”The Hobbit”,322,”J. R. R. Tolkien”,”Good condition”
2,”Harry Potter and the Philosopher’s Stone”,324,”J.K. Rowling”,”New”
3,”The Holy Bible”,1328,"Crossway Bibles”,”Good condition, but “”mandatory”” pages are missing”
要注意值内部的双引号是如何Escape的,也可以看到对于Number型的数据,并没有使用QUOTE。
指定不同的Delimiter
[SQL*Plus] SET MARKUP CSV ON DELIMITER |
[SQL*Plus] SELECT * FROM BOOKS;
“BOOK_ID”|”TITLE”|”PAGES”|”AUTHOR”|”CONDITION”
1|”The Hobbit”|322|”J. R. R. Tolkien”|”Good condition”
2|”Harry Potter and the Philosopher’s Stone”|324|”J.K. Rowling”|”New”
3|"The Holy Bible"|1328|"Crossway Bibles"|"Good condition, but ""mandatory"" pages are missing"
在命令行(Command Line)中使用
[oracle] sqlplus -S -M "csv on” / as sysdba @/tmp/get_books.sql | sed ‘/^$/d’
“BOOK_ID”,”TITLE”,”PAGES”,”AUTHOR”,”CONDITION”
1,”The Hobbit”,322,”J. R. R. Tolkien”,”Good condition”
2,”Harry Potter and the Philosopher’s Stone”,324,”J.K. Rowling”,”New”
3,"The Holy Bible",1328,"Crossway Bibles","Good condition, but ""mandatory"" pages are missing"
- -S 参数使SQL*Plus运行在silent模式,no banner、no prompt、no echoing of commands
- sed 命令删除空白行
其他方式
也可以使用SQLDeveloper或者SQLcl更轻松的完成,SQLcl好像在12.2.0.1版本之后会自动安装。
参考文档: ask-tom