如何把ORACLE裡的資料,以SQLPLUS匯出成CSV檔案。
在藍森林找到一段語法,好像還滿能符合這需求的~
先筆記起來TRY看看!
sqlplus scott/tiger << @END set pagesize 0 ; set feedback off ; spool output.csv.tmp ; select ename||', '||empno||', '||hiredate from scott.emp; spool off @END ; 再利用 grep -v ^SQL 的指令運用,擷取有用的資料內容。 grep -v ^SQL output.csv.tmp > output.csv
output.csv 就會是我們希望看到的CSV檔案!
最近軟體課那邊開發的程式也到要實測階段了,很快就會面臨把舊資料匯入新資料庫的課題。
由於新舊的資料庫分析不同,也就是說,兩邊的資料表架構,會有某程度的差異。
利用以上的語法,把舊資料匯成CSV檔後,可以方便讓HR的同事核校。
之後,再把校對好的資料,匯入新的資料庫裡。
補充一:
這篇是講利用文字指令的方式,如果有像SQL Developer, TOAD等工具軟體。
當然就另當別論~
上OTN查到一種更簡易的語法,就是……
定義SQLPLUS的環境變數!
SET COLSEP ','
補充二:
想要使用PL/SQL的朋友,也可以參考
->http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:88212348059
->Export Oracle dump query result to CSV format
Here the simple procedure to do it,CREATE OR REPLACE FUNCTION DUMP_CSV (
P_QUERY IN VARCHAR2,
P_SEPARATOR IN VARCHAR2 DEFAULT ‘,’,
P_DIR IN VARCHAR2,
P_FILENAME IN VARCHAR2
) RETURN NUMBER
ISL_OUTPUT UTL_FILE.FILE_TYPE;
L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
L_COLUMNVALUE VARCHAR2 (2000);
L_STATUS INTEGER;
L_COLCNT NUMBER DEFAULT 0;
L_SEPARATOR VARCHAR2 (10) DEFAULT ”;
L_CNT NUMBER DEFAULT 0;BEGIN
L_OUTPUT := UTL_FILE.FOPEN (P_DIR, P_FILENAME, ‘w’);
DBMS_SQL.PARSE (L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);
FOR I IN 1 .. 255 LOOP
BEGIN
DBMS_SQL.DEFINE_COLUMN (L_THECURSOR, I, L_COLUMNVALUE, 2000);
L_COLCNT := I;
EXCEPTION WHEN OTHERS THEN
IF (SQLCODE = -1007) THEN
EXIT;
ELSE
RAISE;
END IF;
END;
END LOOP;DBMS_SQL.DEFINE_COLUMN (L_THECURSOR, 1, L_COLUMNVALUE, 2000);
L_STATUS := DBMS_SQL.EXECUTE (L_THECURSOR);LOOP EXIT WHEN (DBMS_SQL.FETCH_ROWS (L_THECURSOR) <= 0); 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 || L_COLUMNVALUE); L_SEPARATOR := P_SEPARATOR; END LOOP;
UTL_FILE.NEW_LINE (L_OUTPUT);
L_CNT := L_CNT + 1;
END LOOP;DBMS_SQL.CLOSE_CURSOR (L_THECURSOR);
UTL_FILE.FCLOSE (L_OUTPUT);RETURN L_CNT;
END DUMP_CSV;
/To test it, you can simply run
SELECT dump_csv (‘SELECT * FROM EMPLOYEES’, ‘,’, ‘WORK_DIR’, ‘test.csv’) FROM DUAL;
- P_QUERY = ‘SELECT * FROM EMPLOYEES’
- P_SEPARATOR = ‘,’
- P_DIR = ’WORK_DIR’
- P_FILENAME = ‘test.csv’WORK_DIR is oracle directory, that create through this script,
CREATE OR REPLACE DIRECTORY WORK_DIR AS ‘C:\csv’;
沒有留言:
張貼留言