Oracle
 sql >> база данни >  >> RDS >> Oracle

ORA-04061:съществуващото състояние на тялото на пакета PACKAGE.NAME е невалидно, продължава

Oracle прави това, защото повторното компилиране на PL/SQL пакет обезсилва всички използвани променливи на сесията.

Не можем да направим много, за да избегнем това, освен като използваме добри практики за внедряване. Не внедрявайте промени, докато базата данни се използва, уверете се, че всички връзки са правилно прекъснати и т.н. По-лесно е да се каже, отколкото да се направи в тази епоха на CI/CD, нулев престой и други вълнуващи нововъведения.

Така че има едно нещо в задната част на шкафчето:pragma serially_reusable; . Тази инструкция означава, че състоянието на пакета се поддържа за продължителността на едно извикване на сървър . Например, ако имаме PL/SQL блок, който извиква SR процедура три пъти, всички променливи, променени от тази процедура, ще поддържат стойността в трите извиквания. Но следващия път, когато стартираме блока - в същата сесия - променливите ще бъдат нулирани до началните си стойности.

Има няколко ограничения за серийно повторно използваем PL/SQL - например, той не може да се използва в SQL заявки. Но голямата атракция от ваша гледна точка е, че вече няма грешки ORA-04068 или ORA-04061. Няма състояние на сесията, няма нищо за невалидност.

pragma serially_reusable трябва да се декларира на ниво пакет и в тялото, както и в спецификацията. Така че трябва да сте сигурни, че никоя от пакетираните процедури не трябва да поддържа състояние в извикванията на сървъра.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Повреда на датата на Oracle по време на актуализация

  2. Oracle SYS_GUID не се променя

  3. Изчисляване на възрастта на Oracle от дата на раждане и днес

  4. java.lang.ArrayIndexOutOfBoundsException:за jdbc връзка

  5. Списък за избор на Oracle apex и скриване на стойности