PL / SQL выполняет оптимизацию хвостового вызова? - PullRequest
1 голос
/ 04 августа 2009

Я довольно плохо знаком с языком, и мне было интересно, были ли оптимизированы хвостовые вызовы. На другом языке я мог бы проверить машинный код или промежуточное представление и понять его для себя, но не знаю, как это сделать в PL / SQL.

Заранее спасибо.

1 Ответ

3 голосов
/ 04 августа 2009

В онлайн-документах не рекомендуется:

http://download -east.oracle.com / Docs / кд / B19306_01 / appdev.102 / b14261 / subprograms.htm # i2884

Каждый рекурсивный вызов создает новый экземпляр любых предметов, заявленных в подпрограмма, включая параметры, переменные, курсоры и исключения. Аналогично, новые экземпляры SQL заявления создаются на каждом уровне в рекурсивном спуске.

И

Как минимум один путь должен привести к Завершающее условие. В противном случае рекурсия будет продолжаться до PL / SQL не хватает памяти и поднимает предопределенное исключение STORAGE_ERROR.

Если бы была доступна оптимизация хвостового вызова, она не исчерпала бы память (хотя она могла бы истечь некоторое время, если вы позволили бы ей работать слишком долго.)

Возможно, вы сможете экспериментально увидеть, что она делает: написать рекурсивную функцию, которая завершается завершающим вызовом, и наблюдать за использованием памяти процессом Oracle при его вызове, или посмотреть, какое сообщение об ошибке вы получаете. Посмотрим, сможешь ли ты заставить его висеть бесконечно, не увеличивая память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...