🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #183430

Re: przeładowanie pakietu

#183430
From: Marcin Wróblewski
Date: Sat, 11 Jul 2009 09:42
210 lines
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-mail
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>

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