1

私は言語にかなり慣れていないので、末尾呼び出しが最適化されているかどうか疑問に思っていました。他の言語では、マシンコードまたは中間表現を調べて自分で理解することができましたが、PL/SQL でそれを行う方法がわかりません。

前もって感謝します。

4

1 に答える 1

3

オンライン ドキュメントでは、次のことは推奨されていません。

http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#i2884

各再帰呼び出しは、パラメーター、変数、カーソル、および例外を含む、サブプログラムで宣言された項目の新しいインスタンスを作成します。同様に、再帰降下の各レベルで SQL ステートメントの新しいインスタンスが作成されます。

と:

少なくとも 1 つのパスが終了条件につながる必要があります。そうしないと、PL/SQL がメモリー不足になり、事前定義された例外 STORAGE_ERROR が発生するまで、再帰が続行されます。

テール コールの最適化が利用可能であれば、ストレージが不足することはありません (実行時間が長すぎると、タイムアウトになる可能性があります)。

それが何をするかを実験的に確認できるかもしれません: 自分自身への末尾呼び出しで終了する再帰関数を記述し、それを呼び出したときの Oracle プロセスのメモリ使用量を観察するか、どのようなエラー メッセージが表示されるかを確認します。メモリを増やさずに無期限にハングアップできるかどうかを確認してください。

于 2009-08-04T18:31:21.773 に答える