packageを更新するときに、バックアップ作業で必要になったので。

-- backup.sql
spool foo_package.sql

column TEXT FORMAT a4000
set linesize 4000

set pagesize 0
set head off
set feed off

select text from user_source
where name = FOO and type = PACKAGE
order by line;

spool off
quit

上記のようなSQLファイルを作成し、以下の方法で実行する。

$ sqlplus scott/tiger @backup.sql
  • textは、varchar2(4000)なので、一行で出力するようcolumnを指定する。
  • pagesizeを0にすると、カラム名などが全く表示されなくなる。
  • nameはパッケージ名、プロシージャ名、ファンクション名などを指定する。
  • typeは対象の種類。PACKAGE, PACKAGE BODY, FUNCTION, PROCEDUREなど
  • 行数を昇順でソート。

あとは、foo_package.sqlの各行の末尾にある空白を削除する。

via
  • COLUMN フォーマット例 - オラクル・Oracle SQL*Plus リファレンス
  • SET PAGESIZE - オラクル・Oracle SQL*Plus リファレンス
  • サイレントモードでSQL*Plusを起動する - オラクル・Oracle SQL*Plus リファレンス