Khi sử dụng SQLcl với Cơ sở dữ liệu Oracle, bạn có thể xuất kết quả truy vấn của mình sang tệp JSON với SPOOL
lệnh.
Ví dụ
Dưới đây là một ví dụ xuất toàn bộ bảng:
SET SQLFORMAT json;
SPOOL '/Users/barney/data/regions.json';
SELECT * FROM regions;
SPOOL off;
SET SQLFORMAT ansiconsole;
Đây là những gì nó đã làm, từng dòng một:
- Dòng đầu tiên đặt
SQLFORMAT
tớijson
. Điều này đảm bảo rằng.json
kết quả của chúng tôi trên thực tế tệp có chứa JSON. Ngoài ra, bạn có thể sử dụngjson-formatted
để xuất JSON ở định dạng thân thiện với con người hơn (sẽ nói thêm về điều này sau). - Dòng thứ hai sử dụng
SPOOL
lệnh để chỉ định nơi tệp đầu ra sẽ được ghi. Đảm bảo thay đổi/Users/barney/data/regions.json
đến một vị trí trên hệ thống của bạn và một tên tệp thích hợp. - Trên dòng thứ ba, tôi đã chạy truy vấn SQL - kết quả mà tôi đang xuất. Trong trường hợp này, tôi đã xuất toàn bộ
regions
bảng. - Tiếp theo, tôi đã chuyển
SPOOL
tắt. - Cuối cùng, tôi đặt
SQLFORMAT
quay lại cài đặt ban đầu của tôi, đó làansiconsole
. Đây là tùy chọn - bạn có thể để nó tạijson
nếu bạn thích hoặc thay đổi nó thành thứ khác.
Đây là tệp kết quả trông như thế nào:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]} 4 rows selected.
Như đã đề cập, bạn cũng có tùy chọn sử dụng json-formatted
để xuất JSON ở định dạng thân thiện với con người hơn, có thụt lề, v.v. Tôi đã bao gồm một ví dụ về điều này ở cuối bài viết này.
Xóa phản hồi
Bạn có thể xóa X rows selected
khi tắt SET FEEDBACK off
:
SET SQLFORMAT json;
SET FEEDBACK off;
SPOOL '/Users/barney/data/regions_feedback_off.json';
SELECT * FROM regions;
SPOOL off;
SET FEEDBACK on;
SET SQLFORMAT ansiconsole;
Kết quả:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}
Trong trường hợp này, tôi đã chuyển FEEDBACK
quay lại sau khi xuất tệp.
Nối kết quả
Theo mặc định, SPOOL
sử dụng REPLACE
, sẽ thay thế tệp nếu nó đã tồn tại.
Tuy nhiên, chúng tôi có thể sử dụng APPEND
đối số để nối kết quả vào tệp.
Ví dụ:
SET SQLFORMAT json;
SET FEEDBACK off;
SPOOL '/Users/barney/data/regions_feedback_off.json' APPEND;
SELECT * FROM regions;
SPOOL off;
SET FEEDBACK on;
SET SQLFORMAT ansiconsole;
Tệp kết quả:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]} {"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}
Ví dụ này đã nối kết quả vào tệp đã được tạo (và được điền) trong ví dụ trước. Điều này dẫn đến kết quả truy vấn bị trùng lặp trong tệp.
Ghi đè tệp hiện có
Chúng ta có thể sử dụng REPLACE
để ghi đè lên tệp hiện có bằng kết quả của một truy vấn mới:
SET SQLFORMAT json;
SET FEEDBACK off;
SPOOL '/Users/barney/data/regions_feedback_off.json' REPLACE;
SELECT * FROM regions;
SPOOL off;
SET FEEDBACK on;
SET SQLFORMAT ansiconsole;
Tệp kết quả:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}
Như đã đề cập, REPLACE
là cài đặt mặc định, vì vậy chúng tôi có thể đơn giản bỏ qua hoàn toàn đối số này.
JSON được định dạng
Ngoài ra, bạn có thể sử dụng json-formatted
để xuất JSON ở định dạng thân thiện với con người hơn:
SET SQLFORMAT json-formatted;
SPOOL '/Users/barney/data/regions_formatted.json';
SELECT * FROM regions;
SPOOL off;
SET SQLFORMAT ansiconsole;
Kết quả:
{"results":[{"columns":[{"name":"REGION_ID","type":"NUMBER"},{"name":"REGION_NAME","type":"VARCHAR2"}],"items": [ {"region_id":1,"region_name":"Europe"} ,{"region_id":2,"region_name":"Americas"} ,{"region_id":3,"region_name":"Asia"} ,{"region_id":4,"region_name":"Middle East and Africa"} ]}]}