sql >> Base de Datos >  >> RDS >> Oracle

Procedimiento Desbordamiento de búfer

En primer lugar, normalmente no usaría DBMS_OUTPUT para iniciar sesión En general, tendría mucho más sentido escribir los datos en una tabla de registro, especialmente si su procedimiento de registro se definió como una transacción autónoma para que pudiera monitorear los datos de registro mientras se ejecutaba el procedimiento. DBMS_OUTPUT solo se mostrará después de que todo el procedimiento haya terminado de ejecutarse, momento en el que generalmente no tiene sentido.

Relacionado con ese primer punto, confiar en DBMS_OUTPUT indicarle a la persona que llama que ha habido algún tipo de excepción es una práctica muy mala. Como mínimo, le gustaría volver a generar la excepción que se lanzó para obtener la pila de errores a fin de depurar el problema.

En segundo lugar, cuando habilita la salida, debe especificar el tamaño del búfer que DBMS_OUTPUT puede escribir a. Parece que ha declarado que el búfer es de 20 000 bytes, que es el valor predeterminado si simplemente

SQL> set serveroutput on;

Puede cambiar eso especificando un tamaño, pero el tamaño máximo está limitado a 1 000 000 bytes

SQL> set serveroutput on size 1000000;

Si planea actualizar 3 mil millones de filas en fragmentos de 1000 filas, será un búfer demasiado pequeño. Vas a generar más de 60 veces esa cantidad de datos con tu código actual. Si está utilizando 10.2 tanto en el cliente como en el servidor, debería poder asignar un búfer ilimitado

SQL> set serveroutput on size unlimited;

pero esa no es una opción en versiones anteriores.

Finalmente, ¿está seguro de que necesita recurrir a PL/SQL en primer lugar? Parece que podría hacer esto de manera más eficiente simplemente ejecutando una sola ACTUALIZACIÓN

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

Eso es mucho menos código, mucho más fácil de leer y será más eficiente que la alternativa PL/SQL. El único inconveniente es que requiere que su tablespace UNDO sea lo suficientemente grande para acomodar el UNDO que se genera, pero actualizar una sola columna de NULL a un valor numérico que no sea NULL no debería generar tanto UNDO.