Oracle
 sql >> Base de données >  >> RDS >> Oracle

Procédure Buffer overflow

Tout d'abord, vous n'utiliseriez normalement pas DBMS_OUTPUT pour la journalisation. Il serait généralement beaucoup plus logique d'écrire les données dans une table de journal, en particulier si votre procédure de journalisation a été définie comme une transaction autonome afin que vous puissiez surveiller les données du journal pendant l'exécution de la procédure. DBMS_OUTPUT ne s'affichera qu'après la fin de l'exécution de toute la procédure, auquel cas il est généralement quelque peu inutile.

Lié à ce premier point, en s'appuyant sur DBMS_OUTPUT indiquer à l'appelant qu'il y a eu une sorte d'exception est une très mauvaise pratique. Au minimum, vous voudriez relancer l'exception qui a été levée afin d'obtenir la pile d'erreurs afin de déboguer le problème.

Deuxièmement, lorsque vous activez la sortie, vous devez spécifier la taille du tampon que DBMS_OUTPUT peut écrire à. Il semble que vous ayez déclaré que le tampon est de 20 000 octets, ce qui est la valeur par défaut si vous simplement

SQL> set serveroutput on;

Vous pouvez changer cela en spécifiant une taille mais la taille maximale est limitée à 1 000 000 octets

SQL> set serveroutput on size 1000000;

Si vous envisagez de mettre à jour 3 milliards de lignes par tranches de 1 000 lignes, ce sera un tampon beaucoup trop petit. Vous allez générer plus de 60 fois cette quantité de données avec votre code actuel. Si vous utilisez 10.2 à la fois sur le client et sur le serveur, vous devriez pouvoir allouer un tampon illimité

SQL> set serveroutput on size unlimited;

mais ce n'est pas une option dans les versions antérieures.

Enfin, êtes-vous certain de devoir recourir au PL/SQL en premier lieu ? Il semble que vous puissiez le faire plus efficacement en exécutant simplement une seule MISE À JOUR

UPDATE table_
   SET id = floor( seq/ 10000000000000 )
 WHERE id is null;

C'est beaucoup moins de code, beaucoup plus facile à lire et sera plus efficace que l'alternative PL/SQL. Le seul inconvénient est qu'il nécessite que votre tablespace UNDO soit suffisamment grand pour accueillir l'ANNULATION générée, mais la mise à jour d'une seule colonne de NULL à une valeur numérique non NULL ne devrait pas générer autant d'annulation.