sql >> Database >  >> RDS >> Oracle

Procedure Bufferoverloop

Ten eerste zou je normaal gesproken geen DBMS_OUTPUT . gebruiken voor het loggen. Het zou over het algemeen veel logischer zijn om de gegevens naar een logtabel te schrijven, vooral als uw logprocedure was gedefinieerd als een autonome transactie, zodat u de loggegevens kon controleren terwijl de procedure liep. DBMS_OUTPUT wordt pas weergegeven nadat de hele procedure is uitgevoerd, op welk punt het over het algemeen enigszins zinloos is.

Gerelateerd aan dat eerste punt, vertrouwend op DBMS_OUTPUT om de beller aan te geven dat er een soort van uitzondering is geweest, is een zeer slechte gewoonte. Je zou op zijn minst de exception die is gegenereerd opnieuw willen verhogen, zodat je de error-stack krijgt om het probleem op te lossen.

Ten tweede, wanneer u uitvoer inschakelt, moet u de grootte van de buffer specificeren die DBMS_OUTPUT naar kan schrijven. Het lijkt erop dat je de buffer hebt gedeclareerd op 20.000 bytes, wat de standaard is als je gewoon

SQL> set serveroutput on;

U kunt dat wijzigen door een grootte op te geven, maar de maximale grootte is beperkt tot 1.000.000 bytes

SQL> set serveroutput on size 1000000;

Als u van plan bent 3 miljard rijen in 1000 rij-brokken bij te werken, zal dat een veel te kleine buffer zijn. Je gaat meer dan 60 keer zoveel data genereren met je huidige code. Als u 10.2 zowel op de client als op de server gebruikt, zou u een onbeperkte buffer moeten kunnen toewijzen

SQL> set serveroutput on size unlimited;

maar dat is geen optie in eerdere releases.

Tot slot, weet u zeker dat u in de eerste plaats gebruik moet maken van PL/SQL? Het lijkt erop dat u dit efficiënter kunt doen door simpelweg een enkele UPDATE uit te voeren

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

Dat is veel minder code, veel gemakkelijker te lezen en efficiënter dan het PL/SQL-alternatief. Het enige nadeel is dat uw UNDO-tabelruimte groot genoeg moet zijn voor de UNDO die wordt gegenereerd, maar het bijwerken van een enkele kolom van NULL naar een niet-NULL numerieke waarde zou niet zoveel UNDO moeten genereren.




  1. Mysql-toegang geweigerd wegens gebruikersfout?

  2. Oracle-tekst bevat en technische inhoud

  3. jjjj-mm-dd omzetten in mm/dd/jjjj

  4. Installeer PostgreSQL op Ubuntu 20.04