SORU
19 EYLÜL 2010, Pazar


MySQL saklı yordam vs işlevi, hangi kullanmalıyım?

MySQL saklı yordam ve işlev bakıyorum. Gerçek fark nedir?

Benzer görünüyor, ama bir işlevi daha fazla sınırlamalar vardır.

Muhtemelen yanılıyorum, ama saklı bir yordam her şeyi yapabilir ve daha saklı bir işlev olabilir gibi görünüyor. Neden/ne zaman bir prosedür kullanın vs bir işlev görecek miyim?

CEVAP
22 Kasım 2012, PERŞEMBE


Prosedürler ve fonksiyonlar arasında en genel farkı, farklı amaçlar için farklı ve çağrılan olmasıdır:

  1. Bir yordamı herhangi bir değer döndürmez. Bunun yerine, bir tablo üzerinde değişiklik yapma ya da alınan kayıtları işlem gibi bir işlem gerçekleştirmek için bir CALL deyimi ile çağrılır.
  2. Bir işlevi, bir ifade içinde çağrılır ve doğrudan ifade kullanılmak üzere arayan için tek bir değer döndürür.
  3. ARAMA ifadesi ile bir işlevi çağırmak olamaz, ne de bir ifade yordamı çağırabilirsiniz.

Rutin oluşturulması için sözdizimi biraz prosedürler ve fonksiyonlar için farklıdır:

  1. Yordam parametreleri giriş-tek çıkış-sadece, ya da her ikisi olarak tanımlanabilir. Bu bir prosedür değerleri arayana geri çıkış parametreleri kullanarak geçmek anlamına gelir. Bu değerler, ÇAĞRI bildirimini izleyen tablolarda erişilebilir. İşlevleri yalnızca giriş parametreleri var. Hem prosedürler hem de fonksiyonlar parametreleri olsa da, sonuç olarak, yordam parametre bildirimi fonksiyonları için farklıdır.
  2. Fonksiyonlar geri dönüş değeri veri türünü belirtmek için işlev tanımında DÖNDÜRÜR bir madde olmalı yani değer döndürür. Ayrıca, işlev gövdesi içinde en az bir RETURN ifadesi çağırana bir değer döndürmek için olmalı. İade ve İADE prosedürünü tanımlar görünmüyor.

    • Saklı bir yordamı çağırmak için, CALL statement kullanın. Saklı bir işlevi çağırmak için bir ifade bakın. İşlevi ifade değerlendirme sırasında bir değer verir.

    • Bir prosedür CALL deyimi kullanılarak çağrılır ve değerler çıktı değişkenleri pass kullanarak geri alabilir. Bir işlev başka bir işlevi (bu işlev adını çağırarak) gibi bir deyim sadece içinden çağrılabilir, ve skaler bir değer döndürebilir.

    • İÇERİ, DIŞARI, ya da OLE bir parametre olarak belirten bir PROSEDÜR için geçerlidir. Bir İŞLEV için parametreler her zaman parametreleri olarak kabul edilmektedir.

    Eğer hiçbir anahtar kelime parametre adı çıkmadan önce ona verirseniz, varsayılan olarak bir parametre. Saklı fonksiyonlar için parametrelerin önünde değil, ya da OLE.Tüm parametreleri işlev parametreleri olarak kabul edilir.

Saklı yordam veya işlev tanımlamak için PROSEDÜR OLUŞTURMAK veya sırasıyla İŞLEVİ OLUŞTURUN:

CREATE PROCEDURE proc_name ([parameters])
 [characteristics]
 routine_body


CREATE FUNCTION func_name ([parameters])
 RETURNS data_type       // diffrent
 [characteristics]
 routine_body

Bir MySQL uzantısı için saklı yordam (fonksiyonlar) bir prosedür-ebilmek oluşturmak bir sonuç kümesi, hatta birden çok sonuç kümeleri, arayanın işlemi aynı şekilde sonuç olarak bir SELECT deyimi. Ancak, böyle bir sonuç içeriğini doğrudan ifade kullanılamaz ayarlar.

Saklı yordamları(saklı yordam ve saklı işlevleri de atıfta)belirli bir veritabanı ile ilişkili, tablo veya görünümlerin gibi.Bir veritabanı düşürdüğünüzde, veritabanında saklanan rutinleri de bıraktı.

Saklı yordamları ve işlevleri aynı ad paylaşıyoruz.Olası bir işlemdir ve bir veritabanında aynı isimde bir fonksiyon var.

Saklı yordamları dinamik SQL ama işlevleri ya da tetikleyici olarak kullanılabilir.

Hazırlanmış SQL deyimleri (HAZIRLAMAK, YÜRÜTMEK, AYIRMASI HAZIRLAMAK) saklı prosedürler kullanılabilir, ama saklı değil işlevleri ya da tetikler. Böylece, saklı fonksiyonlar ve tetikleyiciler Dinamik SQL dizeleri gibi deyimleri oluşturmak ve onları çalıştırmak için nereye () kullanamazsınız. (Dynamic SQL in MySQL stored routines)

FONKSİYON ve SAKLI YORDAM arasında ilginç farklılıklar: biraz daha fazla

  1. (Bu nokta copied from a blogpost.) Saklı yordam, işlev olarak nereye yürütme planı önceden derlenmiş. Fonksiyon ve çalışma zamanında Çözümlenir derlenmiş. Saklı yordamları, bir Saklı pseudo-kod veritabanında yani derlenmiş şeklidir.

  2. (Bu noktada emin değilim.)
    Saklı yordam güvenlik ve ağ azaltır trafik ve Ayrıca biz herhangi bir saklı yordam çağrısı. bu bir anda uygulamaları. reference

  3. Fonksiyonları normal olarak nerede hesaplamaları için kullanılır prosedürler normalde iş mantığı yürütmek için kullanılır.

  4. İşlevler veritabanı durumunu etkiler (Açık veya kapalı yapın ifadeleri kaydetme veya geri alma işlevi devre dışı) Oysa Saklı yordamları veritabanının durumunu tamamlama vb kullanarak etkileyebilir.
    yukarıda belirtilen: J.1. Restrictions on Stored Routines and Triggers

  5. İşlevler, Saklı yordamları yapmak ise FLUSH ifadeler kullanamaz.

  6. Saklı işlevler, Saklı yordamları karşılık, özyinelemeli olamaz. Not: Özyinelemeli saklı yordamları varsayılan olarak devre dışıdır, ancak max_sp_recursion_depth sunucu sistemi sıfır olmayan bir değer için değişken ayarlayarak sunucu üzerinde etkin olabilir. Daha fazla bilgi için Section 5.2.3, “System Variables” bkz.

  7. Saklı bir işlev veya tetikleyici içinde, zaten kullanılmakta olan bir tabloyu değiştirmek için izin verilmez (okuma veya yazma) işlev veya tetikleyici çağıran deyimi ile. İyi Örnek: How to Update same table on deletion in MYSQL?

Notbazı kısıtlamalar normalde saklı yordam saklı fonksiyonlar ve tetikleyiciler için geçerli olsa da, bu kısıtlamalar eğer saklı bir işlev veya tetikleyici içinden çağrılan saklı prosedürler için geçerli. Bir saklı yordam TEMİZLEME kullanabilirsiniz, ancak, örneğin, bu saklı yordam, bir saklı bir işlev veya tetikleyici olarak adlandırılan.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • guau . .

    guau . .

    25 Ocak 2008
  • LIVESTRONG.COM

    LIVESTRONG.C

    5 EKİM 2005
  • Modus Recordings

    Modus Record

    26 Kasım 2008