Article View: pl.comp.bazy-danych
Article #183430Re: przeładowanie pakietu
From: Marcin Wróblewski
Date: Sat, 11 Jul 2009 09:42
Date: Sat, 11 Jul 2009 09:42
210 lines
6070 bytes
6070 bytes
bagracz pisze:
> On 10 Lip, 09:39, Maseł <mma...@poczta.onet.pl> wrote:
>
>> A mozesz naszkicowac taki prayklad (pseudokod, nie koniecznie prawdziwe
>> nazwy pakietow...) - bo wydaje mi sie, ze na razie nie do konca rozumiem
>> opis problemu.
>
> W dużym uproszczeniu:
>
> Create or replace package PakietA
> A integer default 0;
>
> function getA return integer;
> procedure iniZmiennePakietowe;
> ....
> end;
>
> Create or replace package body PakietA
> ....
> function getA return integer
> begin
> return nvl(A,0);
> end;
>
> procedure iniZmiennePakietowe is
> begin
> A := 1;
> end;
> begin
> iniZmiennePakietowe;
> end;
>
> oraz osobna funkcja (nie w pakiecie)
> create or relace function sprawdzA return integer is
> begin
> return PakietA.getA;
> end;
>
> Tak więc w normalnych warunkach po zalogowaniu jesteśmy w sesji XXX.
> Próba odwołania
> select SprawdzA from dual;
> zwróci 1 bo najpierw pakiet załaduje się do pamieci czyli odpali
> iniZmiennePakietowe, która ustawi A na 1.
>
> Jeśli jednak jesteśmy zalogowani dalej w sesji XXX i pakiet już jest w
> pamieci i teraz z innej sesji Oracle zmienimy coś i przekompilujemy
> specyfikację pakietu A to
> select SprawdzA from dual;
> zwróci 0.
> ale
> select PakietA.getA from dual;
> zwróci 1 po uprzednim zgłoszeniu błędu o przestarzałej wersji pakietu
> A i ponownym wykonaniu
>
> Wniosek z tego taki, że wszystkie niezależne procedury mogące
> odwoływać się do zmiennycm pakietowych powinny się znaleźć w pakiecie,
> który ma sekcję ininicjalizującą te zmienne pakietowe.
> Tak właśnie zrobiłem.
> Muszę tylko jeszcze sprawdzić jak będą zachowywać się triggery
> używające takich zmiennych.
>
>
Zrobilem test na podstawie tego, co piszesz:
1. W pierwszej sesji utworzylem pakiet test_pkg z funkcja getA, oraz
funkcje f_getA (nie w pakiecie), ktora zwraca test_pkg.getA.
2. W drugiej sesji zmienilem cialo pakietu test_pkg (dodalem jedna
zmienna, funkcja getA pozostala ta sama)
3. W pierwszej sesji probowalem wykonac
select f_getA from dual;
i dostalem blad.
Dopiero za drugim razem udalo sie wykonac to zapytanie (i dostalem 1) -
czyli nie potwierdzilo sie to, co piszesz.
Czy nie pomijasz czegos istotnego ("teraz z innej sesji Oracle zmienimy
coś" - moze to "coś" jest istotne)?
Ponizej jest to, co zrobilem:
/**************** pierwsza sesja ********/
SQL> select sid from v$session where audsid = userenv('sessionid');
SID
----------
25
SQL>
SQL> create or replace package test_pkg as
2 function getA return integer;
3 end test_pkg;
4 /
Package created.
SQL> create or replace package body test_pkg as
2 a integer default 0;
3 procedure init
4 is
5 begin
6 a := 1;
7 end;
8
9 function getA return integer
10 is
11 begin
12 return nvl(a,0);
13 end;
14 begin
15 init;
16 end test_pkg;
17 /
Package body created.
SQL>
SQL> create or replace function f_getA return integer
2 is
3 begin
4 return test_pkg.getA;
5 end;
6 /
Function created.
SQL>
SQL> select f_getA from dual;
F_GETA
----------
1
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-07-11 11:29:27
/**************** druga sesja ********/
SQL> select sid from v$session where audsid = userenv('sessionid');
SID
----------
23
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-07-11 11:29:43
SQL> create or replace package body test_pkg as
2 a integer default 0;
3 -- dodanie nowej zmiennej
4 b integer default 10;
5 procedure init
6 is
7 begin
8 a := 1;
9 end;
10
11 function getA return integer
12 is
13 begin
14 return nvl(a,0);
15 end;
16 begin
17 init;
18 end test_pkg;
19 /
Package body created.
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-07-11 11:29:43
/**************** pierwsza sesja ********/
SQL>
SQL> select sid from v$session where audsid = userenv('sessionid');
SID
----------
25
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-07-11 11:30:03
SQL>
SQL> select f_getA from dual;
select f_getA from dual
*
ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "MW.TEST_PKG" has been invalidated
ORA-04065: not executed, altered or dropped package body "MW.TEST_PKG"
ORA-06508: PL/SQL: could not find program unit being called: "MW.TEST_PKG"
ORA-06512: at "MW.F_GETA", line 4
SQL> select f_getA from dual;
F_GETA
----------
1
Technical Details
Message-ID:
<h39mnd$mou$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<d225d75f-7492-45e9-a79a-8cfbc61e930d@c2g2000yqi.googlegroups.com> <9d35caeb1a5b2cbc4f6c9dc635376835@masel.cs.put.poznan.pl> <aa5e688e-de53-4ecf-97a8-265fc8d87e8d@t13g2000yqt.googlegroups.com> <aad4f0722a7a95515581865d1c94a0a0@masel.cs.put.poznan.pl> <980a3bc8-fd47-4c16-abe3-3750053c68be@32g2000yqj.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: Marcin Wróblewski <m_wroblewski@gazeta.pl> Newsgroups: pl.comp.bazy-danych Subject: Re: przeładowanie pakietu Date: Sat, 11 Jul 2009 11:42:02 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 213 Message-ID: <h39mnd$mou$1@inews.gazeta.pl> References: <d225d75f-7492-45e9-a79a-8cfbc61e930d@c2g2000yqi.googlegroups.com> <9d35caeb1a5b2cbc4f6c9dc635376835@masel.cs.put.poznan.pl> <aa5e688e-de53-4ecf-97a8-265fc8d87e8d@t13g2000yqt.googlegroups.com> <aad4f0722a7a95515581865d1c94a0a0@masel.cs.put.poznan.pl> <980a3bc8-fd47-4c16-abe3-3750053c68be@32g2000yqj.googlegroups.com> NNTP-Posting-Host: chello084010234051.chello.pl Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1247305261 23326 84.10.234.51 (11 Jul 2009 09:41:01 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Sat, 11 Jul 2009 09:41:01 +0000 (UTC) X-User: m_wroblewski In-Reply-To: <980a3bc8-fd47-4c16-abe3-3750053c68be@32g2000yqj.googlegroups.com> User-Agent: Thunderbird 2.0.0.22 (Windows/20090605) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit