2011-02-10 41 views
9

をコンパイルしようと、私はエラーメッセージに遭遇しながら:対象のパッケージを約1kのライン(スペック)を持っているPLS-00123:プログラムが大きすぎる(ダイアナ・ノード)パッケージのコンパイル中にパッケージ

Error: PLS-00123: program too large (Diana nodes) 
Line: 1 

ボディ内の+ 13kライン。 PL/SQLユニットをコンパイルする場合、この上で研究している間、私はthis Ask Tom question

に出くわし、 コンパイラは、解析ツリーを構築します。 PL/SQLユニットの最大サイズは で、 ツリーのサイズによって決定される です。最大数のダイアナノード がこのツリーに存在します。

7.3までは、あなたは2**14(16K) ダイアナ・ノードを持つことができ、および8.0から8.1.3に、 2**15(32K)ダイアナ・ノードが許されました。 8.1.3の場合、この制限は 緩和されました。このため、 (つまり、64M)のダイアナノードがこの ツリーのパッケージとタイプの本体に含まれるようになりました。

ソースコードの行 の面で限界を翻訳 する簡単な方法はありませんが、それはソースコードの行 あたり 約5〜10節が行われていることを私たちの 観察されています。 8.1.3以前では、 コンパイラは、約3,000行のコードを まできれいにコンパイルすることができました。
8.1.3から、パッケージボディでは がリラックスし、 ボディには 、およそ最大で約6,000,000 のコード行が入ります。

これは概算です。 コードに空白が多い場合、 識別子などが長い場合は、 になり、ソースコードがこれより大きくなる可能性があります。あなたが考慮に多くのスペース&大識別子の最後のリストを取る場合でも

は今、私はそれはそれはどこ上記の言及の制限を閉じていないだと結論するのが妥当だと思います。

さらにより、

パッケージの現在のサイズを確認する方法:パッケージのサイズを確認するには

を、あなたが使用することができます 最も近い関連の数は、データ・ディクショナリ内 PARSED_SIZEですUSER_OBJECT_SIZEを表示します。 この値 は、SYS.IDL_xxx$ テーブルに格納されている バイトのDIANAのサイズを提供し、 共有プールのサイズではありません。

[...]

USER_OBJECT_SIZEPARSED_SIZEが50K以下であるときたとえば、64Kの制限 と 経験の問題を開始することができます。

このビューを照会すると、48929の結果が得られます。サイズは47kと公平だと思いますか?

奇妙な部分は、別のスキーマから同じオブジェクトをフェッチして、問題が発生している領域で実行して、コンパイルに成功したことです。

なぜこの特定の領域が問題を引き起こしていますか?

+1

私はそれが長いショットだと知っていますが、問題に直面して、私は質問する必要があります:あなたのラインは非常に、非常に大きいですか? –

+1

彼らは、決して非常に、非常に大きいです – Sathya

答えて

5

プログラムでデバッグ情報を追加してコードをコンパイルしますか?どうやらそれはthis forum postに示された違いを生み出します。

問題 デバッグ用のコンパイルを行うデバッグのために を追加し、余分なコードです。

かを確認するためにこれらのクエリを試すことができます:あなたは、デバッグ用にコンパイルするとき

ALTER PACKAGE debug COMPILE; 
SELECT type, source_size, parsed_size, code_size 
FROM user_object_size 
WHERE name = 'DEBUG'; 

ALTER PACKAGE debug COMPILE DEBUG; 
SELECT type, source_size, parsed_size, code_size 
FROM user_object_size 
WHERE name = 'DEBUG'; 

は CODE_SIZEの違いを観察します。

あなたはDEBUGでコンパイルしている場合、それはあなたのエラーを生成することができ、余分なコードを生成しないように、通常でコンパイルしてみてください。

+0

+1私はこのリンクに私を指してくれてありがとう。 – Sathya

関連する問題