Існае стан пакетаў было скінута

Так што я быў запушчаны працэдуру PLSQL проста выдатна, і кампіляцыя без памылак. Я зрабіў адно змяненне ў маёй працэдуры, і яна па-ранейшаму выдатна кампілюецца, але цяпер, калі я бягу, я атрымліваю гэтую памылку:

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

Любыя ідэі, што гэта можа быць? Змены, якія я зрабіў было настолькі нязначным, што я сумняваюся, што гэта магло б выклікаць гэтую памылку. Загадзя дзякуй за вашу дапамогу!

10

3 адказы

Калі сеанс выкарыстоўвае пакет, які сесія захоўвае некаторы стан пакета. Калі пакет кампілюецца ў наступны раз тая ж сесія спасылка пакета вы атрымаеце гэтую памылку.

Каб пазбегнуць гэтага, пераканайцеся, што вы адключыце кожны сеанс, які мог выкарыстоўваць пакет або мець сеанс зрабіць DBMS_SESSION.RESET_PACKAGE, каб скінуць стан пакета.

23
дададзена
@YogeshJindal гэта выглядае, як вы кажаце нешта іншае, чым darrelinjz. Ён пісаў, што вам трэба запусціць RESET_PACKAGE, на кожнай сесіі, пасля змены пакета, каб пазбегнуць памылкі.
дададзена аўтар pauloya, крыніца
@YogeshJindal Тое, што я прачытаў, што кожны сеанс павінен выканаць гэтую каманду, якая мае сэнс пасля чытання, што робіць каманда, RESET_PACKAGE : <�я>" Гэтая працэдура дэ-канкрэтызуе ўсе пакеты ў гэтай сесіі " Гэта не павінна паўплываць на іншыя сесіі ў базе дадзеных, так запусціўшы яго з тэставага вокны не будзе ўплываць на іншыя сесіі.
дададзена аўтар pauloya, крыніца
Лепшы старт адказу на гэтае пытанне. Было б добра, каб убачыць гэта ажыццяўляецца крыху далей, каб растлумачыць праблему ядра і чаму адбываецца памылка.
дададзена аўтар Andrew Martinez, крыніца
Дзякуючы darreljnz, рашэнне працавала нармальна для мяне. Але спачатку я не зразумеў, што ты saing. Такім чынам, я проста хачу, каб удакладніць ваша рашэнне трохі для іншых. Адкрыць новае акно тэсту у PL/SQL і ўставіць «Begin sys.dbms_session.reset_package; канец;" і націсніце клавішу F9, каб выканаць яго, а затым унесці змены ў пакет або перасабраць пакет, і зараз мы не атрымаем якіх-небудзь памылак у нашых прыкладаннях
дададзена аўтар Yogesh Jindal, крыніца
@PauloManuelSantos Я думаю, што ён кажа, альбо адключыць усе сеансы або запусціць гэтую каманду з сеансу, каб скінуць стан пакета.
дададзена аўтар Yogesh Jindal, крыніца

Калі вы перакампіляваць спецыфікацыю пакета усе залежныя аб'екты прызнаныя несапраўднымі. Залежны аб'ект з'яўляецца любым відам, спецыфікацыя пакета, цела пакета, функцыя або працэдура, якая спасылаецца на любы з дэкларацый у перакампіляваць спецыфікацыях пакета.

Акрамя таго, як адзначыў darreljnz, сеансы звычайна захоўваюць спасылкі на стан пакетаў яны доступ, выклікаючы ORA-04068: існае стан пакетаў было скінута у наступны раз сесія спрабуе спасылацца на пакет.

Гэта апошняе паводзіны з'яўляецца рэальным nuisence і робіць неабходным альбо код запісы, каб паўтарыць аперацыі або закрыць усе актыўныя сесіі пасля ўстаноўкі новай версіі пакета (эфектыўна перазапускам дадатку/службы). Вынік: Гэта робіць яго цяжэй ўсталяваць выпраўленне.

4
дададзена

Выкарыстоўвайце Прагма serially_reusable у пакуецца і яго цела.

3
дададзена
што ён робіць, чаму гэта рашэнне? просьба ўдакладніць
дададзена аўтар TecHunter, крыніца