“Saklı İşlemler” ve “Saklı Fonksiyonlar” arasındaki farklar nelerdir?


36

Dolayısıyla, bu sorudan bir yorum, PostgreSQL'de "Saklı Usuller" ve "Saklı Fonksiyonlar" arasında küçük bir fark olduğunu belirtir.

Yorum, bir wikipedia makalesine bağlanıyor, ancak bunun bir kısmı geçerli görünmüyor (örneğin bir SELECTaçıklamada kullanılabilecekleri ).

Sözdizimi kendisi biraz kafa karıştırıcı gibi görünüyor:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Bir tane yaratıyorsunuz FUNCTIONama buna bir bakın PROCEDURE.

Peki bu ikisi arasındaki fark nedir?

Yanıtlar:


43

Resmen, PostgreSQL sadece "fonksiyonlara" sahiptir. Tetikleme işlevlerine bazen "tetikleme prosedürleri" denir, ancak bu kullanımın belirgin bir anlamı yoktur. Dahili olarak, fonksiyonlara bazen sistem kataloğundaki gibi prosedürler de denir pg_proc. Bu PostQUEL'den bir devir. Bazı kişilerin (muhtemelen farklı veritabanı sistemlerinde deneyime sahip), SQL enjeksiyonlarını engelleme ya da çıktı parametrelerinin kullanımıyla ilgili olmaları gibi prosedürlerle ilişkilendirebilecekleri tüm özellikler, PostgreSQL'de olduğu gibi işlevler için de geçerlidir.

Şimdi, PostgreSQL topluluğundaki insanlar "saklı yordamlar" veya "gerçek saklı yordamlar" hakkında konuştuğunda, genellikle, vücudundaki işlemleri başlatabilen ve durdurabilen işlev benzeri bir nesnenin varsayımsal bir özelliği anlamına gelir; yap. Bu bağlamda "saklı yordam" teriminin kullanımı, diğer veritabanı ürünlerine benzerlik göstermektedir. Belirsiz bir fikir için bu posta listesi başlığına bakın .

Bununla birlikte, uygulamada, işlem yerine getirme yetenekleri bakımından işlem yerine bu işlev ayrımı evrensel olarak kabul edilmez ve kesinlikle veritabanı önyargısına sahip olmayan pek çok programcı, işlemin geri dönüş değeri olmayan bir işlev olarak Pascal benzeri bir yorumunu alır. (SQL standardı, bir temeli atmış gibi görünmektedir; varsayılan olarak bir prosedür, bir işlevden farklı bir işlem davranışına sahiptir, ancak bu, nesne başına ayarlanabilir.) Yani, her durumda ve özellikle Stack Exchange ile ilgili sorulara bakarken çok karışık bir kitleye, çok fazla varsaymaktan kaçınmalı ve daha net terimler kullanmalı veya beklediğiniz özellikleri tanımlamalısınız.


14

DDL açısından, Postgres'te işlem nesneleri yoktur, sadece işlevler vardır. Postgres işlevleri, değer (ler) i geri getirebilir veya geçersiz kılar, böylece diğer RDBMS'lerde hem işlevlerin hem de prosedürlerin rollerini üstlenebilirler. 'Yordam' sözcüğü create triggerbir işlevi ifade eder.

Postgres belgelerine bakıldığında, 'prosedür', aynı zamanda işlev olarak adlandırılan veritabanı nesnesiyle de eşanlamlıdır, örneğin: " CREATE FUNCTION komutuyla bir tetikleyici yordam oluşturulur ".

Tetikleyici 'prosedürler' özel kurallara sahiptir: argümanlar içermeyen bir fonksiyon ve bir tetikleyici geri dönüş tipi olarak bildirilmelidir . Burada örnek .


8

"Saklı yordam" ve "saklanmış işlev" terimleri PostgreSQL'de birbirlerinin yerine kullanılır ve genellikle aynı anlama gelir. Diğer veritabanları bir prosedür ve fonksiyon arasında farklılık gösterebilir (VB'nin alt rutinler ve fonksiyonlar arasında nasıl farklılaştığı gibi).

PostgreSQL'deki bir işlev, tabloya benzeyen bir şey döndürdüğü sürece, bu işlevin çıktısını standart bir tablo gibi kullanabilirsiniz. CREATE TRIGGERSözdizimi biraz kafa karıştırıcı, ama ANSI standardı tamamlanmıştır önce yerinde olduğundan şüphe. Sadece SQL: 2003'ün bir kopyasına sahibim, bu yüzden isimlendirmenin neden garip olduğunu tahmin etmekten daha fazlasını yapamam.

TL; DR sürümü: PostgreSQL "prosedürü" ile "işlev" e eşdeğerdir.


6

MSSQL'de saklı bir prosedür önceden derlenmiş bir sql komutları setidir.
Saklı yordam:

 - birçok girdi ve çıktı parametresine sahip olabilir
 - veritabanı tablolarını / yapılarını / verilerini değiştirmek için kullanılabilir
 - normal olarak insert / update / delete / select cümleleri içerisinde kullanılmaz
Kullanıcı tanımlı fonksiyonlar çeşitli lezzetlerde gelir. Yazılan işlevin türüne bağlı olarak, işlevler:
  - birden fazla giriş parametresi olabilir, ancak yalnızca tek bir değer döndürür (örneğin, birleştirme)
  - bir girişi girdi olarak kabul edebilir, tek bir değer döndürür (örneğin, dbo.FindLargestPig (ListOfPigs))
  - bir tablo döndür (örneğin, dbo.ExplodeString'den * seçin ("bu bir sözcük listesidir"))
  - select / insert / update / delete ifadelerinde kullanılabilir
  - Veritabanı tablolarını / yapılarını / verilerini değiştirmek için KULLANILAMAZ


5

Kısa cevap, bir fonksiyonun bir değer döndürmesidir, ancak prosedür vermez.

Bu ayrım, SQL 1992 için önerilen Kalıcı Saklı Modüllerde (SQL / PSM) mevcuttu. SQL / PSM'nin standartlara uyup uymadığını bilmiyorum.


2003
itibariyle

Bu VB'nin sözdizimine oldukça benziyor. Bir işlev bir değer döndürür ve (bunu derleyici üzerinde patlatmak verecek bir işlevde bir dönüş değeri vardı eğer öyleyse) bir prosedür yok
jcolebrand

@jcolebrand Aslında, isimler Pascal'da daha belirgin. Bir işlev sonuç verirken prosedür bir sonuç vermez. Tarihsel nedenlerden dolayı VBA, onları SUBROUTINE & FUNCTION diye çağıran (? Olarak adlandırılan) FORTRAN dilini kullanır . Modern C-tipi dillerin sadece fonksiyonları vardır, fakat yazılan diller, başka bir isimle prosedür olan geçersiz fonksiyonlar seçeneğine sahiptir. Popüler bir eğilim, her şey için yalnızca normal işlevleri kullanmak ve eğer istersen yoksayılabilecek bir şey döndürmektir.
Manngo

2

Kabul edilen cevabı soyut kavramsal düzeyde karşılaştırarak, farkı işlevsellik ve girdi / çıktı perspektifinden anlıyorum. Aşağıda, sırasıyla saklı yordam ve işlevi göstermek için sp ve f kullandım.

  1. Bir ifadede kullanın: sp bir ifadede kullanılamaz, işlev iken bu, döndürülen değerinizi af gibi diğer ifadelerin içinden kullanabilirsiniz.

    select * 
    from table 
    where col_a < (select col_A from f())
  2. bir değer döndürür: refcursor return türünü belirtmezseniz , imleci açıp döndürürseniz, sp otomatik olarak bir değer döndürmez; f, bir select cümlesi gibi, 'return' yan tümcesinin gömüldüğü son ifadedeki sonucu döndürür .

  3. tekli / çoklu sonuç kümeleri döndürür: burada sonuç kümeleri, tekli tamsayı kümesi, metin dizisi ve iki tablo gibi formatta farklılık gösterebilecek sonuçların bir listesini gösterir. sp, refcursor return türünü belirlediğiniz sürece birden fazla kümeyi döndürebilir, imleci açıp geri dönebilir. Bununla birlikte, f yalnızca bir set kümeye dönebilir.

Genellikle, saklanan prosedürler veri tabanındaki verileri veya geri dönüş değerinin gerekli olmadığı yapıyı değiştirmek için kullanılır; silme, güncelleme, bırakma , vb. veya çoklu sonuç kümelerinin gerekli olduğu durumlar. Öte yandan, işlev çoğunlukla düz sorgular için seçilir.

Açıklamamla ilgili daha fazla ayrıntı için lütfen bu bağlantıya bakın: PostgreSQL'de Saklı Prosedürler ve İşlevler

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.