it-swarm-eu.dev

Je nutné potvrzení operace po operaci DML ve funkci / proceduře?

Zajímalo by mě, zda je nutné po vložení/odstranění/aktualizaci funkce/procedury napsat potvrzení?

Příklad:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

nebo postup

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

je třeba se smazat po smazání?

Nelze pochopit následující situaci:

  1. Pokud volám funkci/proceduru z okna SQL, pak to vyžaduje potvrzení

    ale

  2. Pokud naplánuji funkci/proceduru pomocí dbms_scheduler a spustím úlohu, příkaz pro odstranění se automaticky potvrdí.

    PROČ?

20
kupa

Obecně by se postupy neměly zavázat. Tyto druhy rozhodnutí o kontrole transakcí by měly být ponechány na kódu vyšší úrovně, který ví, kdy je logická transakce skutečně dokončena. Zavazujete-li se uvnitř uložené procedury, omezujete její opakované použití, protože volající, který chce, aby změny provedené postupem byly součástí větší transakce, nemohou proceduru jednoduše volat přímo.

Pokud zavoláte proceduru interaktivně, budete muset transakci explicitně potvrdit nebo vrátit zpět, protože Oracle nemá potuchy, pokud máte v úmyslu volat proceduru jako logickou transakci nebo pokud chcete vytvořit větší transakci zahrnující více volání procedur. Pokud používáte dbms_scheduler, dbms_scheduler předpokládá, že úloha je logickou transakcí a zavazuje se na konci úlohy za předpokladu, že byla úspěšná (dbms_job dělá totéž).

Funkce by neměly především manipulovat s daty. Funkce, která manipuluje s daty, nemůže být vyvolána z příkazu SQL (kromě rohového případu, kdy je funkce deklarována jako autonomní transakce, která je téměř nikdy vhodná). Celým smyslem jak funkcí, tak procedur je to, že funkce mohou být vloženy do příkazů SQL a mohou být uživatelům udělovány volně, protože nemění žádná data.

24
Justin Cave

Odpověď na vaši otázku; PROČ?

Pravděpodobně to už víte už teď, protože příspěvek je 2 roky starý. Ale budu odpovídat jen za záznam.

Důvod č. 1 vyžaduje potvrzení a # 2 nikoli, protože výchozí nastavení databáze v Oracle je potvrzení transakce na konci relace. Pokud jste v sqlplus a spusťte kód ručně, nebude transakce ihned potvrzena. Pokud zadáte explicitní potvrzení OR odhlásíte se od sqlpus), transakce se potvrdí.

Důvod, proč dostanete automatické potvrzení na # 2, je ten, že vytváří relaci pro spuštění skriptu. Po dokončení se automaticky odhlásí, což způsobí automatické potvrzení.

4
Steve Cunningham