oracle - zmienna globalna
mariaczi - 19-09-2007 00:08
oracle - zmienna globalna
Witam,
w pakiecie jest funkcja wywoływana z/przez aplikację. Jak zabezpieczyć (co zastosować) aby w danej chwili mogła być uruchomiona tylko 1 raz? Kolejny raz może zostać uruchomiona po zakończeniu poprzedniego wywołania. Myślałem o użyciu jakiejś globalnej zmiennej dla wszystkich instancji tej funkcji. Jak zrealizować to "pojedyncze" wywołanie.
Z góry dziękuję za pomoc, pozdrawiam.
Wiktor Moskwa - 19-09-2007 00:08
On 18.09.2007, mariaczi <mariaczi@WYTNIJTO.op.pl> wrote: > Witam, > > w pakiecie jest funkcja wywoływana z/przez aplikację. Jak zabezpieczyć > (co zastosować) aby w danej chwili mogła być uruchomiona tylko 1 raz? > Kolejny raz może zostać uruchomiona po zakończeniu poprzedniego > wywołania. Myślałem o użyciu jakiejś globalnej zmiennej dla wszystkich > instancji tej funkcji. Jak zrealizować to "pojedyncze" wywołanie.
Jeśli wykonywanie tej funkcji ma być rzeczywiście szeregowane globalnie to DBMS_LOCK. Co ma ta funkcja robić? Może można to rozwiązać mniej drastycznie zakładając blokady tylko na niektóre wiersze.
-- Wiktor Moskwa
mariaczi - 19-09-2007 00:08
On Tue, 18 Sep 2007 07:47:15 +0000 (UTC), Wiktor Moskwa <wiktorDOTmoskwa@gmail.com> wrote:
>On 18.09.2007, mariaczi <mariaczi@WYTNIJTO.op.pl> wrote: >> Witam, >> >> w pakiecie jest funkcja wywoływana z/przez aplikację. Jak zabezpieczyć >> (co zastosować) aby w danej chwili mogła być uruchomiona tylko 1 raz? >> Kolejny raz może zostać uruchomiona po zakończeniu poprzedniego >> wywołania. Myślałem o użyciu jakiejś globalnej zmiennej dla wszystkich >> instancji tej funkcji. Jak zrealizować to "pojedyncze" wywołanie. > >Jeśli wykonywanie tej funkcji ma być rzeczywiście szeregowane >globalnie to DBMS_LOCK. >Co ma ta funkcja robić? Może można to rozwiązać mniej drastycznie >zakładając blokady tylko na niektóre wiersze. Funkcja ma na podstawie danych z innych tabel generować nowe wiersze do "swoich" tabel.Chodzi mo o takie zablokowanie aby niemożliwe było uruchomienie tej funkcji w tym samym czasie przez 2 lub wiecej uzytkowników. Funkcja jest wywoływana z dll'a delphi. Aplikacja (klient) uruchamiana jest lokalnie na kazdej maszynie.
Wiktor Moskwa - 19-09-2007 00:08
On 18.09.2007, mariaczi <mariaczi@WYTNIJTO.op.pl> wrote: > On Tue, 18 Sep 2007 07:47:15 +0000 (UTC), Wiktor Moskwa ><wiktorDOTmoskwa@gmail.com> wrote: >> >>Jeśli wykonywanie tej funkcji ma być rzeczywiście szeregowane >>globalnie to DBMS_LOCK. >>Co ma ta funkcja robić? Może można to rozwiązać mniej drastycznie >>zakładając blokady tylko na niektóre wiersze. > Funkcja ma na podstawie danych z innych tabel generować nowe wiersze > do "swoich" tabel.Chodzi mo o takie zablokowanie aby niemożliwe było > uruchomienie tej funkcji w tym samym czasie przez 2 lub wiecej > uzytkowników. Funkcja jest wywoływana z dll'a delphi. Aplikacja > (klient) uruchamiana jest lokalnie na kazdej maszynie.
Ale tak biznesowo co ta funkcja robi? :) Agregacja danych? Replikacja? Jakieś skomplikowane przetwarzanie? Może funkcja powinna być uruchamiana okresowo co jakiś czas w zdefiniowanym JOBie, a nie za każdym razem przez różnych klientów. Tak w ogóle to jaka to jest wersja Oracle?
Funkcje z pakietu DBMS_LOCK pozwolą Ci wymusić wykonywanie funkcji tylko przez 1 transakcję jednocześnie - ale to oczywiście może uniemożliwić pracę z aplikacją.
-- Wiktor Moskwa
bogdan no - 20-09-2007 00:03
> w pakiecie jest funkcja wywoływana z/przez aplikację. Jak zabezpieczyć > (co zastosować) aby w danej chwili mogła być uruchomiona tylko 1 raz? > Kolejny raz może zostać uruchomiona po zakończeniu poprzedniego > wywołania. Myślałem o użyciu jakiejś globalnej zmiennej dla wszystkich > instancji tej funkcji. Jak zrealizować to "pojedyncze" wywołanie.
Hej
Można to obejść, np. sprawdzając przed wywołaniem funkcji lub tuż po wejściu do niej, ustawiając jakąś wartość (0/1) w utworzonej specjalnie ku temu tabelce. A można by się pokusić (jeżeli juz sie tworzy tabelę specjalnie ku temu) o logowanie używania tej funkcji.
pzdr bogdan
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
=?ISO-8859-2?Q?Marcin_Wr=F3blewski?= - 21-09-2007 00:03
mariaczi <mariaczi@WYTNIJTO.op.pl> napisał(a):
> Witam, > > w pakiecie jest funkcja wywoływana z/przez aplikację. Jak zabezpieczyć > (co zastosować) aby w danej chwili mogła być uruchomiona tylko 1 raz? > Kolejny raz może zostać uruchomiona po zakończeniu poprzedniego > wywołania. Myślałem o użyciu jakiejś globalnej zmiennej dla wszystkich > instancji tej funkcji. Jak zrealizować to "pojedyncze" wywołanie. > > Z góry dziękuję za pomoc, > pozdrawiam.
Stwórz jakąś tabelkę, powiedzmy tab, z jednym wierszem - dowolnym.
Na początku twojej procedury wykonaj:
select * from tab for update nowait;
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
zanotowane.pldoc.pisz.plpdf.pisz.plwawa19wwa91.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|