1

Je suis assez nouveau à la langue, et je me demandais si les appels de queue étaient optimisés. Dans un autre langage, je pourrais examiner le code machine ou une représentation intermédiaire et le comprendre moi-même, mais je n'ai aucune idée de la façon de le faire en PL/SQL.PL/SQL effectue-t-il l'optimisation des appels de queue?

Merci d'avance.

Répondre

3

Les docs en ligne suggèrent pas:

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

Chaque appel récursif crée une nouvelle instance de tous les éléments déclarés dans le subprogram, y compris les paramètres, les variables , curseurs et exceptions. De même, de nouvelles instances des instructions SQL sont créées à chaque niveau dans la descente récursive.

Et:

Au moins un chemin doit conduire à une condition de terminaison . Dans le cas contraire, le récursion continuerait jusqu'à ce que PL/SQL à court de mémoire et augmente la STORAGE_ERROR d'exception prédéfinie .

Si l'optimisation des appels de queue était disponible, il ne serait pas à court de stockage (bien qu'il pourrait frapper un certain délai d'attente si vous laissez courir trop longtemps.)

Vous pouvez être en mesure de voir expérimentalement ce c'est le cas: écrivez une fonction récursive qui se termine par un appel de fin à lui-même, et observez l'utilisation de la mémoire du processus Oracle lorsque vous l'appelez, ou voyez le message d'erreur que vous obtenez. Voyez si vous pouvez le faire pendre indéfiniment sans utiliser de mémoire croissante.

+0

J'ai codé simple factoriel et l'exécuter sur un Oracle XE en cours d'exécution sur mon poste de travail a épuisé sa mémoire virtuelle, il semble que vous aviez raison. Merci beaucoup. BTW, est-il possible d'obtenir n'importe quel type d'assembleur d'Oracle? – Samuel

+0

Je suppose que PL/SQL est largement interprété. –

+0

PL/SQL peut être interprété ou compilé dans des versions plus récentes. Si vous voulez vraiment obtenir un niveau bas, vous pouvez essayer de programmer en PRO * C. –