- PR -

PLS-00123:プログラムが大きすぎます。 の対策で悩んでいます

1
投稿者投稿内容
くくぽぽ
会議室デビュー日: 2005/11/22
投稿数: 17
お住まい・勤務地: 関西
投稿日時: 2006-03-03 20:47
長文にて失礼します。

現在、本番稼動中のストアドプロシージャ(SP)の修正対応をしているのですが、
SPのコンパイル時に、以下の様なメッセージが出現して
対応に四苦八苦しています。

PLS-00123:プログラムが大きすぎます。

開発環境で使用しているDBMSは、以下の通りです。
oracle 8.1.7.0

oracleの仕様書などを読んでみると、
プログラムをコンパイル後の中間言語のサイズが64KBを超えると
上記のエラーが発生することが分かりました。

ただ、現在修正中のソースは、単純に関数やパッケージに分けることができません。
その理由は、以下の通りです。
・全関数に引数が一切ない
・使用する変数は全てソースの上部にて宣言されている
・上部にて宣言している変数を80以上の関数で使いまわしている
・コード量が7100行以上(コメントを全部除去した状態でも6000行以上)

尚、このSPは、オンラインで同時に複数回起動される可能性があります。

本番で動作している以上、
簡単に作り直すわけにもいかず、
かといってお客様の要望を反映しないわけにもいかないため、
非常に頭を抱えております。

oracleの64KBの制約を何とかして突破する方法はないでしょうか。


[ メッセージ編集済み 編集者: くくぽぽ 編集日時 2006-03-03 20:48 ]

[ メッセージ編集済み 編集者: くくぽぽ 編集日時 2006-03-03 20:49 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 20:54
引用:

くくぽぽさんの書き込み (2006-03-03 20:47) より:

ただ、現在修正中のソースは、単純に関数やパッケージに分けることができません。
その理由は、以下の通りです。
・全関数に引数が一切ない
・使用する変数は全てソースの上部にて宣言されている
・上部にて宣言している変数を80以上の関数で使いまわしている
・コード量が7100行以上(コメントを全部除去した状態でも6000行以上)


ブロック サイズの制限ですので、ブロックで分けるだけでも OK だったような...
ただ、上記の説明を見る限りブロック分けも困難極まりそうですが。(;^-^)
何にせよ、リファクタしていく必要がありますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
くくぽぽ
会議室デビュー日: 2005/11/22
投稿数: 17
お住まい・勤務地: 関西
投稿日時: 2006-03-03 21:33
引用:

じゃんぬねっとさんの書き込み (2006-03-03 20:54) より:
引用:

くくぽぽさんの書き込み (2006-03-03 20:47) より:

ただ、現在修正中のソースは、単純に関数やパッケージに分けることができません。
その理由は、以下の通りです。
・全関数に引数が一切ない
・使用する変数は全てソースの上部にて宣言されている
・上部にて宣言している変数を80以上の関数で使いまわしている
・コード量が7100行以上(コメントを全部除去した状態でも6000行以上)


ブロック サイズの制限ですので、ブロックで分けるだけでも OK だったような...
ただ、上記の説明を見る限りブロック分けも困難極まりそうですが。(;^-^)
何にせよ、リファクタしていく必要がありますね。



じゃんぬねっと 様、素早いご返答ありがとうございます。
今、私が切に求めているものがあります。
それは、パラメータです。
oracleの何かのパラメータの64という数値を256に変更したら、
256KBまでOK!という
魔法のパラメータはないでしょうか…。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 21:55
引用:

くくぽぽさんの書き込み (2006-03-03 21:33) より:

oracleの何かのパラメータの64という数値を256に変更したら、256KBまでOK!という
魔法のパラメータはないでしょうか…。


今、解決方法を探ってみたんですが、なさそうです。

  PLS-00123: プログラムが大きすぎます

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-03-03 22:04
引用:

じゃんぬねっとさんの書き込み (2006-03-03 21:55) より:
PLS-00123: プログラムが大きすぎます


のリンク先から引用します。
引用:

PL/SQLは安定したトランザクション処理を実現することを重視して設計されています。こうした特殊な目的で設計された結果、PL/SQLコンパイラはブロック・サイズに制限を設けています。


16ビットマイコンの VM 上で動いているのかと思っていましたが、この<s>言い訳</s>言い回し、どこかで使わせてもらいます。
くくぽぽ
会議室デビュー日: 2005/11/22
投稿数: 17
お住まい・勤務地: 関西
投稿日時: 2006-03-03 22:55
誠に申し訳ありません。
不用意にEnterキーを押してしまいました…。

じゃんぬねっと 様、unibon 様
見ず知らずの私を
色々と助けて頂き、誠にありがとうございます。
とりあえず、色々と試して駄目だったら諦めて
無理矢理、関数化しようと思い、
1つ1つ考えられる方法を試していると…、
奇跡は起こりました。

どう違うのかは良く分からないのですが、以下の対応をすることにより、
コンパイルが通る様になりました。

1.問題のprocedureだけを宣言したパッケージを作成
2.パッケージのbody部に、procedureをコピペ

コンパイル及び、実行も上手くいきます。
パッケージ内部で宣言すると、中間言語のサイズが64KBよりも
小さくなるのでしょうか?

詳細は、調査してみないと良く分かりませんが、
いずれにせよ、こんな時間帯に悩んでいる私を助けて頂き、
誠にありがとうございました。

また、問題が再発するかもしれませんが…、
その時はまた同スレッドに書き込みを行います…。


[ メッセージ編集済み 編集者: くくぽぽ 編集日時 2006-03-03 22:57 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-04 01:38
引用:

くくぽぽさんの書き込み (2006-03-03 22:55) より:

コンパイル及び、実行も上手くいきます。
パッケージ内部で宣言すると、中間言語のサイズが64KBよりも小さくなるのでしょうか?


元の大きさがわかりませんので、何とも言えないですが、
最適化を手伝っているのかもしれませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)