İşlev / Prosedürde DML işleminden sonra taahhüt gerekli midir?


20

İşlev / prosedürde ekleme / silme / güncelleme işleminden sonra komut yazmanın gerekli olup olmadığını merak ediyorum.

Örnek:

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

veya prosedür

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

silme işleminden sonra taahhüt gerekiyor mu?

Aşağıdaki durumu anlayamıyorum:

  1. SQL penceresinden işlevi / yordamı çağırırsam

    fakat

  2. Dbms_scheduler kullanarak işlevi / yordamı zamanlar ve işi çalıştırmak, silme deyimi otomatik olarak taahhüt.

    NEDEN?

Yanıtlar:


24

Genel olarak, prosedürler uygulanmamalıdır. Bu tür işlem kontrol kararları, mantıksal bir işlemin ne zaman tamamlandığını bilen daha üst düzey koda bırakılmalıdır. Saklı yordamın içinde işlem yaparsanız, yordamın daha büyük bir işlemin parçası olmasını isteyen değişiklikleri isteyen bir arayan yordamı doğrudan çağıramayacağı için yeniden kullanılabilirliğini sınırlandırıyorsunuz.

Bir yordamı etkileşimli olarak çağırırsanız, işlemin mantıklı bir işlem olmasını düşünüyorsanız veya birden çok yordam çağrısı içeren daha büyük bir işlem oluşturmayı düşünüyorsanız Oracle'ın hiçbir fikri olmadığı için işlemi açıkça yürütmeniz veya geri almanız gerekir. Eğer kullanırsanız dbms_scheduler, dbms_schedulerbir iş mantıksal işlem olduğunu ve başarılı oldu varsayarak işin sonunda (en taahhüt varsayar dbms_jobaynı şeyi yapar).

İlk olarak işlevler verileri manipüle etmemelidir. Verileri işleyen bir işlev bir SQL ifadesinden çağrılamaz (işlevin kendisinin neredeyse hiç uygun olmayan bir otonom işlem kullandığı bildirildiği köşe vakasını engeller). Hem işlevlere hem de yordamlara sahip olmanın tüm amacı, işlevlerin SQL deyimlerine gömülebilmesi ve herhangi bir veri değiştirmediği için kullanıcılara daha serbestçe verilebilmesidir.


1
Oracle'da arayan kişinin prosedür çağrılarını bağlayan bir işleme başlaması mümkün değil mi? SQL Server'da yordamın içinde işlem yapabilirsiniz, ancak arayan bu yordamı çağırmadan önce bir işlem açarsa, arayan da işlem yapana kadar hiçbir şey yapılmaz.
Nick Chammas

4
@NickChammas - Oracle'ın iç içe geçmiş bir işlem kavramı yok, hayır. Prosedür devam ederse, arayanın bu noktaya kadar yaptığı her şey taahhüt eder. Arayan her zaman ilk ifadesiyle örtük olarak bir işlem başlatır (bu bir yordam çağrısı mı yoksa başka bir şey olsun), bu nedenle işlemi sonlandırmak her zaman arayan kişiye bağlı olmalıdır.
Justin Cave

@JustinCave Bu doğru olsa da, otonom işlemleri unutmayın.
Philᵀᴹ

@Phil - Doğru, ama bu çok farklı bir hayvan. Otonom bir işlem, arayan tarafından yapılan taahhüt edilmemiş değişiklikleri göremez ve arayan tarafından geri alınamaz.
Justin Cave

4

Soruna cevap vermek için; NEDEN?

Muhtemelen bunu zaten biliyorsunuz çünkü yazı 2 yaşında. Ama sadece kayıt için cevap vereceğim.

# 1'in bir taahhüdü gerektirmesinin ve # 2'nin gerektirmemesinin nedeni, Oracle'daki varsayılan veritabanı ayarının bir oturum sona erdiğinde bir işlem yapmak olmasıdır. Sqlplus'taysanız ve kodunuzu manuel olarak çalıştırırsanız, işlemi hemen gerçekleştirmez. Açık bir taahhüt verirseniz VEYA sqlpus oturumunu kapatırsanız, işlem gerçekleşir.

# 2'de otomatik bir taahhüt almanızın nedeni, komut dosyanızı çalıştırmak için bir oturum oluşturmasıdır. Tamamlandığında otomatik olarak oturumu kapatır, bu da otomatik bir işleme neden olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.