Amaldagi paketlar holati bekor qilindi

Shuning uchun men PLSQL protsedurasini juda yaxshi ishlashga va hech qanday xatolikka yo'l qo'ymaslikka harakat qilaman. Men protsedura bo'yicha bir o'zgarish qildim va u hali ham kompilyatsiya qilmoqda, ammo men uni boshqarganimda, men bu xatoni qabul qilaman:

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP"
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP"
ORA-06512: at "SCHEMA.XP_ST_002180", line 141
ORA-06512: at line 1

Bu qanday bo'lishi mumkin bo'lgan har qanday fikr? O'zgarishim shunchalik ahamiyatli emaski, men bu xatoga olib kelishi mumkinligiga shubha qilaman. Yordamingiz uchun oldindan rahmat!

10

3 javoblar

Agar sessiya to'plamdan foydalansa, u sessiya paketning ba'zi holatini saqlab qoladi. Agar ushbu paket qayta to'plangan bo'lsa, keyingi safar bir xil sessiya paketga murojaat qilsa, u xatoni oladi.

Buni oldini olish uchun paketni ishlatgan har bir seansni o'chirib qo'ying yoki paketli holatni tiklash uchun seansni DBMS_SESSION.RESET_PACKAGE qilsangiz ishonch hosil qiling.

23
qo'shib qo'ydi
@YogeshJindal darrelinjzdan farqli o'laroq gapirganga o'xshaydi. Xatolarni bartaraf etish uchun paketni almashtirgandan so'ng, har bir seansda RESET_PACKAGE dasturini ishga tushirishingiz kerak.
qo'shib qo'ydi muallif pauloya, manba
@YogeshJindal Men o'qiydigan narsa, har bir sessiya bu buyruqni bajarishi kerak, bu buyruqni o'qigach, mantiqan to'g'ri keladi, "Ushbu koida ushbu sessiyadagi barcha paketlarni aniqlaydi." Ushbu ma'lumotlar bazasidagi boshqa sessiyalarga ta'sir qilmasligi kerak. uni test oynasida ishlash boshqa sessiyalarga ta'sir qilmaydi.
qo'shib qo'ydi muallif pauloya, manba
Bu masala bo'yicha javobning eng yaxshi boshlanishi. Buning asosiy sababini va nima uchun bu xato yuz berayotganini tushuntirish uchun biroz ko'proq harakat qilayotganini ko'rish yaxshi bo'lar edi.
qo'shib qo'ydi muallif Andrew Martinez, manba
Darreljnzga rahmat, men uchun yechim yaxshi ishladi. Lekin birinchi navbatda siz nima qilayotganingizni tushunmadim. Shunday qilib, men sizning echimingizni boshqalar uchun ozgina aniqroq qilmoqchiman. Pl/sql-da yangi test oynasini oching va "start sys.dbms_session.reset_package; end;" va F9 ni ishga tushirish va keyin sizning paketingizda o'zgarishlar qilish yoki to'plamni qayta kompilyatsiya qilish uchun foydalanamiz va endi bizning ilovalarimizda xatolik bo'lmaydi
qo'shib qo'ydi muallif Yogesh Jindal, manba
@PauloManuelSantos Menimcha, u barcha seanslarni uzib qo'yishi yoki paketni holatini tiklash uchun ushbu buyruqni sessiya orqali ishga tushirishni aytadi.
qo'shib qo'ydi muallif Yogesh Jindal, manba

Agar siz paketlar spetsifikatsiyasini qayta kompilyatsiya qilsangiz, barcha qaramli narsalar bekor qilinadi. O'ziga qarashli ob'ekt - qayta ko'rib chiqilgan paketlar spetsifikatsiyasida bayonlarning har qandayiga murojaat qiladigan har qanday ko'rinish, paketlar spetsifikatsiyasi, paketlar tanasi, funktsiya yoki amaliyotdir.

Bundan tashqari, darreljnz ta'kidlaganidek, seanslar odatda o'zlari kirgan paketlar holatiga zahiralarni saqlab qolishadi, bu esa ORA-04068: mavjud bo'lgan paketlar holati ga keyingi safar sessiya to'plami.

Bu oxirgi xatti-harakatlar haqiqiy noqulaylik bo'lib, paketni yangi versiyasini o'rnatgandan so'ng (amalni/xizmatni faol ravishda qayta ishga tushirish) qayta tiklash uchun kod yozish yoki barcha faol seanslarni yopish zaruratini tug'diradi. Pastki qator: bu o'zgarishlar to'g'rilashni qiyinlashtiradi.

4
qo'shib qo'ydi

Paket va uning tanasida pragma serially_reusable dan foydalaning.

3
qo'shib qo'ydi
nima qiladi, nima uchun bu yechim? iltimos, batafsil ma'lumot bering
qo'shib qo'ydi muallif TecHunter, manba