Gblog

おもにTips

CSV出力するためのSQLを出力するためのSQL

CSV出力するためのSQLを書くのがめんどくさいのでつくりました。

おもに、V$ビュー、DBAビューの CSV出力を目的に作成していますが、普通の表でも使えるはず。

 

SQL Developer があればいらないけど、わりと便利で評判がいいんですよね。

 

SET echo off heading off feedback off underline off verify off
SET termout on trimout on trimspool on serveroutput on
SET newpage 0 pagesize 0
SET long 102400
SET linesize 10000
set serveroutput on size unlimited
spool temp.sql
DECLARE
vin varchar2(30) :=upper('&1');
vfname varchar2(30);
vvname varchar2(30);
CURSOR ccols IS
SELECT * FROM DBA_TAB_COLS
WHERE TABLE_NAME = vvname
ORDER BY COLUMN_ID;
vcols ccols%ROWTYPE;
BEGIN
vvname := REPLACE(vin,'V$','V_$');
vfname := REPLACE(vin,'$','_');
DBMS_OUTPUT.ENABLE(1000000);
DBMS_OUTPUT.PUT_LINE('ALTER SESSION SET nls_date_format=''yyyy/mm/dd hh24:mi:ss'';');
DBMS_OUTPUT.PUT_LINE('SET echo off heading off feedback off underline off verify off ' );
DBMS_OUTPUT.PUT_LINE('SET termout off trimout on trimspool on serveroutput on ' );
DBMS_OUTPUT.PUT_LINE('SET newpage 0 pagesize 0 ' );
DBMS_OUTPUT.PUT_LINE('SET long 102400 ');
DBMS_OUTPUT.PUT_LINE('SET linesize 10000 ');
DBMS_OUTPUT.PUT_LINE('SPOOL '|| vfname ||'.log' );
DBMS_OUTPUT.PUT('PROMPT');
DBMS_OUTPUT.PUT(' ');
OPEN ccols;
LOOP
FETCH ccols INTO vcols;
EXIT WHEN ccols%NOTFOUND;
If vcols.column_id = 1 then
DBMS_OUTPUT.PUT('"' || vcols.column_name ||'"');
else
DBMS_OUTPUT.PUT(',"' || vcols.column_name ||'"');
end if;
END LOOP;
CLOSE ccols;
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('SELECT ');
OPEN ccols;
LOOP
FETCH ccols INTO vcols;
EXIT WHEN ccols%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('''"''||' || vcols.column_name || '||''",'' || ' );
END LOOP;
CLOSE ccols;
DBMS_OUTPUT.PUT_LINE('null');
DBMS_OUTPUT.PUT_LINE('FROM sys.' || vvname ||';');
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('spool off');
END;
/
spool off
--@temp.sql

 

SQLファイルは、temp.sql としています。

最後の行のコメントをはずせば temp.sql を実行してデータ出力までしてくれます。