スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Oracleサーバーに登録した PL/SQL のプログラムソースコードを、テキストファイルとして保存するプログラム

Oracleサーバーに登録した PL/SQL のプログラムソースコードを、テキストファイルとして保存するプログラム。

うーむ、結構苦労してしまったorz
ポイントは以下の5点。

1.あらかじめ、使用するディレクトリをOracleに登録しておく。
 (CREATE DIRECTORY 文で登録する)
2.サーバーに登録されているPL/SQLのソースコードを取得するには、
 SELECT TEXT FROM USER_SOURCE WHERE NAME = '関数名';
 などとする。
3.ソースコード格納カラムは、USER_SOURCE.TEXT である。
4.ソースコードのテキストファイルは、ソース行1行について USER_SOURCEテーブル
 (実はViewらしい?)の1レコードという構成になっている。
5.UTL_FILE.PUTでファイルに書き込む時は32KBを超えないタイミングで、時々
 フラッシュしてやらないといけない。
 さもないと、「ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました」
 などという謎のエラーメッセージが出る。(Oracleのエラーメッセージは実に不親切だなあと思う)




create or replace
procedure save_all_my_sources

is
----------------------------------------------------------------------------
--Oracleサーバーに登録されたPROCEDURE等をファイルに保存する
----------------------------------------------------------------------------
procedure save_plsql_source_as_file(
in_procedure_name in varchar2)
is
cursor v_my_cursor is
select text
from user_source
where name = in_procedure_name;
v_rec v_my_cursor%rowtype;
v_filetype utl_file.file_type;
v_filename varchar2(1000) := in_procedure_name || '.sql';
v_num_bytes integer := 0;

begin
v_filetype := utl_file.fopen('MY_PLSQL_DIR', v_filename, 'w');
open v_my_cursor;

loop
fetch v_my_cursor into v_rec;
exit when v_my_cursor%notfound;

utl_file.put(v_filetype, v_rec.text);
v_num_bytes := v_num_bytes + length(v_rec.text);
if (v_num_bytes > 30000) then
--32KB以内でフラッシュしてやらないと謎のエラーが発生してしまう
utl_file.fflush(v_filetype);
v_num_bytes := 0;
end if;
end loop;

utl_file.put_line(v_filetype, '/');

utl_file.fflush(v_filetype);
utl_file.fclose(v_filetype);

exception
when others then
if v_my_cursor%isopen then
close v_my_cursor;
end if;
utl_file.fclose_all();
dbms_output.put_line(SQLERRM);
raise;

end save_plsql_source_as_file;
----------------------------------------------------------------------------

begin

-- あらかじめ以下の設定を行っておくこと。
-- drop directory my_plsql_dir;
-- create directory my_plsql_dir as 'c:\tmp'; --Oracleサーバー上のディレクトリである点に注意
-- GRANT READ ON DIRECTORY my_plsql_dir TO <ユーザーID>;
-- GRANT WRITE ON DIRECTORY my_plsql_dir TO <ユーザーID>;

save_plsql_source_as_file('HOGE1_FUNCTION');
save_plsql_source_as_file('HOGE2_FUNCTION');

end save_all_my_sources;

スポンサーサイト
コメント
コメントの投稿
管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

テーブルのDDLをOracleから抽出する

【目次(記事一覧)へ】 テーブルのCREATE分などのDDLをORACLEから抽出するツールに「DBMS_METADATA(メタデータAPI)」があります。 今回はテーブルのDDLを抽出してみます。 【実行した環境】 DB: Oracle 11gR2 OS: Oracle Enterprise Linux V5 【実行手順...
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。