MS SQL Server Prosedürleri. Saklı yordamlar. Giriş parametreleri ile bir prosedür oluşturma örneği

İşlemin duyurusu

Prosedür oluşturun. [({İn | Out | Inoutout} [,…])]
[Dinamik sonuç kümesi. ]
Başla. [Atomik]

Son.

Anahtar kelimeler
. İçinde (Giriş) - Giriş parametresi
. Çıkış (çıkış) - çıkış parametresi
. Inout - Giriş ve çıkış, ayrıca alan (parametreler olmadan)
. Dinamik sonuç kümesi, prosedürün, prosedürden sonra açık kalacak olan belirtilen sayıda imleci açabileceğini göstermektedir.

Notlar
Ağ ve yığın aşırı yükü nedeniyle saklı yordamlarda (öncelikle büyük sayılar ve sembolik dizeler) birçok parametre kullanılması önerilmez. Uygulamada, mevcut Transact-SQL, PL / SQL ve Informix lehçelerinde, hem parametrelerin beyanında hem de kullanımda, değişkenlerin beyanı ve alt yordam çağrısında standarttan anlamlı bir fark var. Microsoft, saklı yordam önbelleğinin boyutunu tahmin etmek için aşağıdaki yaklaşımın uygulanmasını önerir:
\u003d (maksimum aynı anda çalışan kullanıcıların sayısı) * (en büyük yürütme planının boyutu) * 1.25. Yürütme planının boyutunun, sayfalardaki boyutunun belirlenmesi komutu kullanarak yapılabilir: DBCC MEMUSAGE.

Çağrı prosedürü

Mevcut birçok DBMS'de, saklı yordamların çağrısı operatör kullanılarak gerçekleştirilir:

Prosedürü yürütmek [(][)]

Not: Saklı yordamları aramak, başka bir saklı yordam veya etkileşimli moddan da yapılabilir.

İşlemin duyurulmasına bir örnek

Prosedür Proc1 Oluştur // Prosedürü ilan edin
Cur1 imlecini seçmek için Cur1 imleci, Derecelendirme\u003e 200/9 ilan ettiği satış görevlilerinden şehir
Cur1 // imleci aç
Cur1 // imleçten verileri oku.
@@ fetch_status \u003d 0
Başla.
Cur1'den gelecek getirmek
Son.
Cur cur1 // yakın imleç
Deallocate Cur1
Execute Proc1 // Prosedürü çalıştırın

Polimorfizm
Bu iki alt yordamın parametreleri birbirinden ayırt edilebilmesi için aynı diyagramda aynı isimde iki alt yordam oluşturulabilir. İki alt programı aynı isimde aynı isimde ayırt etmek için her birinin alternatifi verilir ve benzersiz isim (Belirli bir isim). Böyle bir isim, alt rutin belirlendiğinde açıkça belirtilebilir. Alt yordamları ararken, birkaç aynı ad varsa, istenen alt yordamın tanımı birkaç adımda gerçekleştirilir:
. Başlangıçta tüm prosedürleri tanımlar belirtilen isimVe eğer böyle yoksa, belirtilen adla tüm işlevler.
. Daha fazla analiz için, yalnızca bu alt yordamlar ile ilgili olarak ayrılır. bu kullanıcı Yürütme ayrıcalığına sahiptir (yürütme).
. Onlar için, parametrelerin sayısı arama argümanlarının sayısına karşılık gelen kişiler seçilir. Parametrelerde belirtilen veri türleri ve pozisyonları kontrol edilir.
. Birden fazla alt rutin kalırsa, kalifikasyon adı seçilir.
Uygulamada, Oracle polimorfizmi, yalnızca pakette, DB @ - farklı şemada ve Sybase ve MS SQL Server'da açıklanan fonksiyonlar için desteklenir, aşırı yük yasaktır.

Çıkarma ve Değişim Prosedürleri
Prosedürü silmek için, operatör kullanılır:

Prosedürü değiştirmek için, operatör kullanılır:

Alter prosedürü. [([{İn | Out | Inoutout}])]
Başla. [Atomik]

Son.

Prosedürlerin yürütülmesi için ayrıcalıklar

Hibe uygulamak. İçin. |halka açık [Hibe seçeneği ile]

Sistem prosedürleri
Birçok DBM (SQL Server dahil), kendi amaçları için kullanılabilecek belirli bir dahili sistem kaydedilmiş prosedür kümesine sahiptir.

SQL - Ders 15. Saklı yordamlar. Bölüm 1.

Kural olarak, veritabanıyla birlikte çalışmak için aynı istekleri veya bir seri sorgu grubunu kullanırız. Saklı yordamlar, istek sırasını birleştirmenize ve bunları sunucuya kaydetmenize olanak sağlar. Bu çok uygun bir araçtır ve şimdi bu konuda emin olacaksınız. Sözdizimiyle başlayalım:

Prosedür_procedare adını oluşturun.

Parametreler Bunlar, onu ararken prosedürü ileteceğimiz verilerdir ve operatörler aslında taleplerdir. İlk prosedürünüzü yazalım ve rahatlığından emin olalım. Sınıf 10'da, dükkan veritabanında yeni girişler eklediğimizde, türün eklenmesi için standart bir istek kullandık:

Müşterilere (ad, e-posta) değeri ("ivanov sergey", "[email protected]");

Çünkü Yeni bir alıcı eklememiz gereken her zaman böyle bir talebi kullanacağız, bir prosedür olarak düzenlemek oldukça uygundur:

Prosedür Oluştur ins_cust (n char (50), E char (50)) müşterilere (isim, e-posta) değeri (N, E) eklemeye başlayın; Son.

Lütfen parametrelerin nasıl ayarlandığını unutmayın: adı parametreye vermek ve bu türünü belirlemek gerekir ve bu tür işlemin vücudunda zaten parametre adlarını kullanırız. Bir nüans. Hatırladığınız gibi, virgülle olan nokta, talebin sonu anlamına gelir ve bu durumda kabul edilemez olduğunu iddia etmek için gönderir. Bu nedenle, prosedürü yazmadan önce, ayırıcıyı geçersiz kılmanız gerekir; "//" üzerine, istek zamanın önünde gönderilmez. Bu sınırlayıcı // kullanarak yapılır:

Böylece, komutları şimdi takip eden DBM'leri belirttik. Ayırıcının yalnızca bir seans için gerçekleştirileceği hatırlanmalıdır, yani. MySQL ile bir sonraki oturduğunuzda, ayırıcı tekrar virgülle bir nokta olacak ve gerekirse tekrar yeniden tanımlamak zorunda kalacak. Şimdi prosedürü yerleştirebilirsiniz:

Prosedür Oluştur ins_cust (n char (50), E char (50)) müşterilere (isim, e-posta) değeri (N, E) eklemeye başlayın; SON //


Bu yüzden prosedür oluşturulur. Şimdi, yeni bir alıcı girmemiz gerektiğinde, gerekli parametreleri belirten, çağırmamız yeterli. Saklı yordamı aramak için, arama ifadesi kullanılır, ardından prosedürün adını ve parametreleri belirtilir. Masa alıcılarımıza yeni bir alıcı ekleyelim (müşteriler):

İns_cust ("valery baykuşlar", "[email protected]") // arayın.


Tam bir talepte her zaman yazmaktan çok daha kolay olduğuna katılıyorum. Prosedürün çalışıp çalışmadığını kontrol edin, yeni bir alıcının tablo alıcılarında (müşteriler) göründüğünde göründüğünü kontrol edin:

Ortaya çıktı, prosedür çalışır ve operatörü kullanarak onu silceye kadar çalışır Bırak Prosedürü Name_Processures.

Dersin başında belirtildiği gibi, prosedürler istek sırasını birleştirmenize olanak sağlar. Nasıl yapıldığını görelim. Ders 11'de hatırlayın. Bize baskı evi tedarikçisinin sağlayıcısına ne kadar getirdiğini öğrenmek istedik. Bunu yapmak için, yatırım yapılan talepleri, dernekleri, hesaplanan sütunları ve sunumları kullanmak zorunda kaldık. Ve ürünün bize ne kadar getirdiğini öğrenmek istiyorsak başka bir tedarikçi? Yeni talepler, dernekler vb. Yapmak zorunda kalacağız. Bu işlem için bir kez saklı bir prosedür yazmak daha kolaydır.

11 Sınıf 11'de yazdığı 11 sunum ve sorgunun kolayca yazıldığı görülüyor, bunun gibi tedarikçi tanımlayıcısını (id_vendor) giriş parametresini birleştiriyor gibi görünüyor:

Prosedür Oluştur SUM_VENDOR (I int) SELECT magazine_incoming.id_product, magazine_incoming.quantity, fiyatlar.Price, magazine_incoming.quantity * Fiyatları. ID_VENDOR \u003d i) gelen gelenlerden ID_Incoming'i seçin; Report_vendor'dan Toplam (Summa) seçin; SON //

Ancak prosedür çalışmayacak. Olay şu ki pozisyonlar parametreleri kullanamaz. Bu nedenle, istek sırasını biraz değiştirmek zorunda kalacağız. Öncelikle, bir tedarikçi tanımlayıcısını (ID_VENDOR), ürün tanımlayıcısı (ID_Product), miktar, fiyat (fiyat) ve Tutar (Summa), Fiyatlar (Magazine_INGing), fiyatlar (fiyatlar) :

Görünümünü oluşturun. .id_incoming;

Ardından, ilgi alanının tedarikçisinin miktarını, örneğin ID_Vendor \u003d 2 ile özetleyen bir istek oluşturun:

Şimdi, bu isteklerin ikisini, giriş parametresinin, ikinci istek içinde ikame edecek, ancak sunumda olmayan tedarikçinin (id_vendor) tanımlayıcısı olacak şekilde saklı yordamaya birleştirebiliriz.

Prosedür Oluştur SUM_VENDOR (I int) BAŞLATI SEÇİMİ SEÇİMİ OLARAK RAPORU_VENDOR, MAGAZINE_INCOMING.ID_PRODUCT, MAGAZINE_INCOMING.QUANTITY, FİYATLARI, fiyatlar. .id_product ve magazine_incoming.id_incoming \u003d gelen.id_incoming; Report_vendor'dan SUM (Summa) 'ı seçildi. SON //


Prosedürün çalışmalarını kontrol edin, farklı giriş parametreleriyle:


Gördüğünüz gibi, prosedür bir kez tetiklenir ve daha sonra bir hata verir ve bize Rapor_Vendor görünümünün zaten veritabanında mevcut olduğunu söylüyor. Bunun nedeni, prosedüre ilk kez erişirken, bir temsil oluşturur. İkinci kez işlerken, tekrar bir sunum oluşturmaya çalışır, ancak zaten orada, bu nedenle bir hata belirir. Bundan kaçınmak için iki seçenek olabilir.

Birincisi, prosedür hakkında bir fikir edinmektir. Yani, bir zamanlar bir fikir yaratıyoruz ve prosedür sadece onunla iletişim kurmayacak. Daha önce oluşturulan prosedürü ve sunumu silmeyi unutmayacak:

Bırak Prosedür SUM_VENDOR // DROP VIEW REPORT_VENDOR // Görünümünü oluşturun Report_Vendor Olarak Select.Id_Vendor, magazine_incoming.id_product, magazine_incoming.quantity, fiyatlar.Price, magazine_incoming.Quantity * Fiyatlar.Price \u003d fiyatlar.Id_product ve magazine_incoming.id_incoming \u003d gelen.id_incoming // prosedür oluşturma sum_vendor (i int) başlangıcı SUM (SUMMA) 'a rapor_vendor \u003d i; SON //


Çalışma kontrolü:

sum_vendor (1) // call sum_vendor (2) // call sum_vendor (3) // arayın.


İkinci seçenek - Varsa görünümü silecek bir komut eklemek için sağdaki prosedürde:

Prosedür Oluştur Sum_Vendor (I int) Rapor_vendor'u varsa, görünüme başlayın; Görünüm Yaratın Rapor_Vendor, Magazine_inComing.Id_Product, Magazine_inComing.Quantity, Frifices.Price, Magazine_INCOMING.QUANTITY * Fiyatlarla ilgili fiyatlar. .id_incoming; Report_vendor'dan SUM (Summa) 'ı seçildi. SON //

Bu seçeneği kullanmadan önce, Sum_Vendor Prosedürünü silmeyi ve ardından işlemi kontrol etmeyi unutmayın:

Gördüğünüz gibi, karmaşık talepler veya dizileri, saklı yordamda bir kez bir kez yerleştirmek için gerçekten daha kolaydır ve daha sonra gerekli parametreleri belirten basitçe erişin. Bu, kodu önemli ölçüde azaltır ve çalışmayı daha mantıklı isteklerle yapar.

Saklı yordam (eng. Saklanan yordam), bir BD yazılım nesnesidir. SQL Server, birkaç tür için prosedürleri saklıdır.

Sistem saklı yordamları (MUR. Sistem Saklı Prosedürü) DBMS geliştiricileri tarafından verilir ve bir sistem dizinine sahip eylemler yapmak veya sistem bilgisini almak için kullanılır. İsimleri genellikle "SP_" öneki ile başlar. Tüm türlerin saklı yordamları, ECA'ya indirgenebilecek Execute komutu kullanılarak başlatılır. Örneğin, parametreler olmadan çalışan SP_HELPLOGINS prosedürü, hesap adlarında iki rapor oluşturur (Eng. Girişler) ve kullanıcıların her veri tabanında bunlara karşılık gelir (Eng. Kullanıcılar).

Sp_helplogins Exec;

Tablodaki sistem saklı yordamları kullanarak gerçekleştirilen eylemler hakkında bir fikir vermek. 10.6 Bazı örnekler verilmiştir. SQL Server'daki toplam sistemde depolanan prosedürlerde binden fazla.

Tablo 10.6.

Sistem depolanan prosedürlerin örnekleri SQL Server

Kullanıcı, kullanıcı veritabanlarında ve geçici nesneler için veritabanında saklı yordamlar oluşturmak için kullanılabilir. İkinci durumda, saklı yordam olacak geçici. Tıpkı geçici tablolar durumunda olduğu gibi, geçici saklı yordamın adı, eğer yerel bir geçici saklı yordamsa veya "##" dan "#" öneki ile başlamalıdır. Yerel zaman prosedürü, yalnızca oluşturulduğu bağlantı çerçevesinde, küresel - ve diğer bileşikler çerçevesinde kullanılabilir.

SQL Server programlanabilir nesneler hem Transact-SQL araçlarını kullanarak hem de montajları kullanarak oluşturulabilir. (Eng. Meclis) CRL'de (Ortak Dil Çalışma Zamanı), Microsoft.NET Framework platformu. Bu ders kitabında, sadece ilk yöntem dikkate alınacaktır.

Sabit prosedürler oluşturmak için, format aşağıda gösterilen formatta, oluşturma prosedürü ifadesi kullanılır (Proc'a indirilebilir):

Oluştur (Proc I Prosedürü) Proc_Name [; Numara]

[(Gparametre Data_Type)

["Varsayılan] |

[İLE [, ... n]]

[Çoğaltma için]

([BACAK] SQL_STATEMENT [;] [... N] [son])

Saklı yordam (veya tetikleme, işlev, gösterim) şifreleme seçeneğiyle oluşturulursa, kodu metnin okunamaz hale geleceği şekilde dönüştürülür. Aynı zamanda, erken SQL Server sürümlerinden kullanılan algoritma tarafından belirtildiği ve güvenilir bir koruma algoritması olarak kabul edilemez - zıt dönüşümü hızlı bir şekilde gerçekleştirmenize izin veren yardımcı programlar var.

RECOMPILL seçeneği, işlemin her birinin sistemin her birinin metni yeniden derlemesini belirtir. Her zamanki durumda, ilk başlatma sırasında derlenen prosedür, hızı arttırmaya izin veren önbelleğe kaydedilir.

Prosedürün yürütülmesi gereken güvenlik bağlamını tanımlar. Sonra, f arayanın değerlerinden birini belirtir. Self | Sahibi | "Kullanıcı adı"). Arayan, varsayılan değerdir ve kodun bu modülü çağıran kullanıcı güvenlik bağlamında yürütüleceği anlamına gelir. Buna göre, kullanıcının yalnızca programlanabilir nesneye değil, aynı zamanda etkilenen diğer BD nesnelerine de izin vermelidir. Programlanabilir bir nesneyi oluşturan veya değiştirme bir kullanıcı bağlamı kullanılarak kendinlik anlamına gelir. Sahibi, kodun prosedürün mevcut sahibi bağlamında yürütüleceğini gösterir. Sahibi bunun için tanımlanmazsa, o zaman şemanın sahibi ait olduğu anlaşılmaktadır. "User_name" olarak yürütülür, kullanıcı adını (tek tekliflerde) açıkça belirtmenize olanak sağlar.

Prosedür için parametreler belirtilebilir. Bunlar, değerleri prosedüre aktarmak için kullanılan yerel değişkenlerdir. Parametre çıkış anahtar sözcüğü (veya kısaltılmış) ile bildirilirse, bir çıktıdır: tamamlandıktan sonra prosedürde belirtilen değer, prosedüre neden olan program tarafından kullanılabilir. Readonly anahtar sözcüğü, parametre değerinin saklı yordamın içinde değiştirilemediği anlamına gelir.

Parametreler, parametrenin değeri, prosedürü çağırırken parametrenin değeri açık formda belirtilmeyecekti varsayılan değerlere atanabilir. Bir örnek düşünün:

Proc Surma (@ ve int, @b int \u003d 0,

© sonuç int çıkışı) olarak

Set @ sonuç \u003d 0a + 0b

Üç parametreye sahip bir prosedür oluşturduk ve @b parametresi varsayılan değer \u003d 0'dur ve parametre @Result çıktıdır: İçindeki değer, aranan programa döndürülür. Gerçekleştirilen eylemler oldukça basittir - çıkış parametresi iki girişin toplamının değerini alır.

SQL Server Management Studio'da çalışırken, oluşturulan saklı yordam programlanabilir BD nesneleri bölümünde bulunabilir. (Eng. Programlanabilirlik) saklı yordamların alt bölümünde (Şekil 10.2).

Bir prosedür ararken, hem değişkenler hem de sabitler giriş parametreleri olarak kullanılabilir. İki örneği düşünün. Birincisi, prosedürün giriş parametreleri açıkça sabitlerle ayarlanır, anahtar kelime çıkışı, Çağrı'da çıkış parametresinde belirtilir. İkinci düzenlemede, değişkenin değeri, birinci giriş parametresi olarak ve kullanılan ikinci parametre için kullanılır. anahtar kelimeler Varsayılan varsayılan değerin kullanılması gerektiği belirtilir:

İncir. 10.2.

@ İnt ile ilan etmek;

Exec Summa 10.5, @ C çıkışı;

0C yazdırın; - 15 geri çekilecek

Gi int \u003d 5 ilan etmek;

- Arama yaparken, varsayılan değeri kullanın

YOP SUMMA GI, Varsayılan, 0S Çıkışı;

0C yazdırın; - geri çekilecek 5

Şimdi, prosedürün biteceği bir dönüş kodu analizi ile bir örnek olarak düşünün. Bookl tablosundaki kaç kitap belirtilen yıllarda yayınlandığını hesaplamak için gerekli olmasına izin verin. Aynı zamanda, ilk yıl daha sonlu olduğu ortaya çıkıyorsa, prosedür "1" döndürür ve sayma yapmaz, aksi takdirde, kitap sayısını görür ve 0:

Proc dbo.rownum (0firsylear int, glastear int, 0result int çıkışı) olarak oluşturun.

Eğer 0FirsYSYEAR\u003e 0LastyEar Return 1

@ Sonuç Set \u003d (Dbo.Bookl konumundan (*) Seçin (*)

0Firsyear ve 0LastyEar arasında);

İade kodunun bir tamsayı değişkeni 0ret içinde depolandığı bu prosedürü arama seçeneğini düşünün, daha sonra değeri analiz edilir (bu durumda 1 olacak). Baskı ifadesinde kullanılan döküm fonksiyonu, tamsayı değişkeni gresin değerini dize türüne dönüştürmek için kullanılır:

0ret int, gres int ilan etmek

Exec Gret \u003d ROWNUM 2004, 2002, GRES OUT;

Eğer 0ret \u003d l yazdırırsa "İlk yıl finalden daha büyük"

"Kitap Sayısı" + Döküm (varchar (20) olarak) yazdırın

Saklı yordamlar sadece tablodaki verileri okuyamaz, aynı zamanda verileri de değiştirebilir ve hatta tablolar ve bir dizi diğer BOD nesnesi oluşturabilir.

Bununla birlikte, depolanan prosedürden şemalar, fonksiyonlar, tetikleyiciler, prosedürler ve sunumlar oluşturmak imkansızdır.

Aşağıdaki örnek, hem bu olasılıkları hem de geçici nesnelerin görünürlük alanı ile ilgili sorunları göstermektedir. Aşağıdaki saklı yordam, geçici bir tablonun varlığını kontrol eder. Bu tablo olmazsa, onu yaratır. Bundan sonra, iki sütunun değerleri tabloya girilir; ve tablonun içeriği görüntülenir. operatör Seç:

Proc My_Procl (@id int, @Name varchar (30))

Eğer Object_ID ("tempdb.dbo. # Tab21) null

DBO'ya yerleştirin. # Tab2 (ID, Ad) Değerleri (0ID, 0NAME)

Dbo'dan * seçeneğini seçin. # Tab2 -№1

İlk aramadan önce, saklı yordam, içinde kullanılan geçici bir tablo oluşturacaktır. EZEZ ifadesine dikkat edin. Önceki örneklerde, parametreler "pozisyon" prosedürüne iletildi ve bu durumda başka bir parametre transfer formatı kullanılıyor - "Adı", açıkça parametrenin adını ve değerini gösterir:

Tablo Dbo oluşturun. # Tab2 (ID int, adı varchar (30));

EXEC MY_PROCL 0NAME \u003d "LVAN", 0ID \u003d 2;

DBO'dan * seçeneğini seçin. # Tab2; -№2

Örnekte, SELECT Operator iki kez çalışacaktır: prosedürün içindeki ilk kez, ikinci kez - Kodun arama kodundan ("No. 2" yorumuyla işaretlenmiş).

İkinci aramadan önce, geçici bir tabloyu siliyorum. Daha sonra aynı adın zaman çizelgesi saklı yordamdan oluşturulur:

Damla tablo dbo. # Tab2;

Exec my_procl 0Name \u003d "ivan", 0ID \u003d 2;

DBO'dan * seçeneğini seçin. # Tab2; -№2

Bu durumda, veriler yalnızca prosedür içindeki SELECT ifadesini görüntüleyecektir ("HA 1"). "No. 2" seçeneğini belirleyin Bir hata ile sonuçlanır, çünkü depolanan prosedürde oluşturulan geçici tablo, prosedürden döndürüldüğünde, TEMPDB tabanından zaten kaldırılır.

Doldurma prosedürü operatörünü kullanarak saklı yordamı silebilirsiniz. Formatı aşağıda sunulmuştur. Bir operatör, birkaç saklı yordamı, virgülle listeleyebilir:

Bırak (Prosedür) (Prosedür) [

Örneğin, önceden oluşturulan Summa Prosedürünü silin:

Bırak Proc Summa;

Mevcut bir prosedürde (ve aslında - geçersiz kılmak için) değişiklikler yapın) ALTER prosedürü operatörünü kullanabilir

uyarınca azaltma işlemi). Alter anahtar kelime hariç, operatör formatı prosedürü oluşturma işlemi ile pratik olarak çakışır. Örneğin, DBO prosedürünü değiştirin. ROWNUM, OFİH'nin güvenlik bağlamında icra seçeneğini belirleyin:

Alter proc dbo.Rownum (sfirsyear int,

Slastyear int, sresult int çıkışı)

Sahip olarak yürütme ile - yüklü seçeneği

Eğer 0FirsYSYEAR\u003e 0LastyEar döndürme 1

Set 0Result \u003d (Dbo.bookl'tan (*) Seçin (*)

Sfirsyoar ve slastyar arasında);

Bazı durumlarda, bir komutu dinamik olarak oluşturmak için gerekli olabilir ve veritabanı sunucusunda çalıştırılması gerekebilir. Bu görev, EZEZ operatörü kullanılarak da çözülebilir. Aşağıdaki örnekte, BookL tablosundaki bir giriş numunesi, değişkeni kullanarak belirtilen değere eşit olan yılın modeli kullanılarak gerçekleştirilir:

0U int \u003d 2000 ilan etmek;

Exec ("SELECT * 'den dbo.bookl nerede \u003d" + @ Y);

Dinamik olarak oluşturulmuş talimatları gerçekleştirmek, "SQL-Enjeksiyon" gibi bilgisayar saldırılarının uygulanması için ön koşullar oluşturur. (Eng. SQL Enjeksiyonu). Saldırının özü, talimatın SQL kodunu dinamik olarak oluşturulmuş bir talebe getirmesidir. Bu genellikle ayarlar veri giriş sonuçlarından kullanıcı tarafından alındığında olur.

Önceki örneği seglessly değiştirin:

0U varchar (100);

0U \u003d "2OOO"; - Kullanıcıdan aldık

SET deyiminde atanan dize değerinin, kullanıcıdan aldık (örneğin, bir web uygulaması aracılığıyla), örneğin kodumuzun "düzenli" davranışını göstermektedir.

0U varchar (100);

Set 0u \u003d "2000; dbo.book2'den silin; - Enjeksiyon

EXEC ("SELECT * 'den DBO.BOOK2 NEREDE \u003d" + 0Y);

Önerilen, mümkünse, eğer mümkünse, bu gibi durumlarda, SQL-Enjeksiyonun engellerinden biri olan parametrelerden biri olan parametrelerin türünü kontrol etmenizi sağlayan Sp_executcsql sistemi saklı yordam. Biçimini ayrıntılı olarak düşünmüyor, daha önce sunulanlara benzer bir örneği analiz edeceğiz:

Sp_executesql'i uygulayın.

N "SELECT * 'den dbo.bookl nereden \u003d 0y",

Sorguda kullanılan parametre türünü açıkça gösterir ve SQL Server yürütülürken izlenecektir. Quotes önündeki "n" harfi, bunun prosedürün gerektirdiği şekilde Unicode formatında gerçek bir sabit olduğunu gösterir. Parametre sadece sabit bir değer değil, aynı zamanda başka bir değişkenin değerini de atanabilir.

SQL saklı yordamlar, çeşitli nesnelerde depolanabilecek yürütülebilir bir yazılım modülüdür. Başka bir deyişle, bu, SQL talimatlarının bulunduğu bir nesnedir. Bu saklı prosedürler istemcide yapılabilir. uygulamalı yazılımİyi performans elde etmek için. Ek olarak, bu tür nesneler genellikle diğer senaryolardan veya hatta diğer bölümlerden bile çağrılır.

Giriş

Birçoğu, çeşitli prosedürlere benzer olduklarına inanıyor (sırasıyla MS SQL hariç). Belki de bu doğrudur. Benzer parametreleri var, benzer değerler üretebilirler. Dahası, bazı durumlarda temasa geçerler. Örneğin, DDL ve DML veritabanlarıyla ve ayrıca kullanıcı işlevleriyle (kod adı - UDF) ile birleştirilirler.

Gerçekte, SQL saklı yordamları, bu tür işlemler arasında onları tahsis eden çok çeşitli avantajlara sahiptir. Güvenlik, Programlama Değişkenliği, Verimlilik - Bütün bunlar, veritabanları ile çalışan kullanıcıları, giderek daha fazla. Prosedürlerin popülerliğinin zirvesi 2005-2010'a düştü, Microsoft'tan gelen "SQL Server Management Studio" adlı program yayınlandı. Bununla birlikte, veritabanları ile çalışmak çok daha kolay, daha pratik ve daha uygun. Yıldan yıla, bu programcılarda popülerlik kazanıyordu. Bugün, kullanıcıların veritabanları ile "iletişim kuran", "Excel" ile bir par üzerinde durduğu kesinlikle tanıdık bir programdır.

Bir prosedür çağırırken, gereksiz işlemler ve kullanıcı müdahalesi olmadan sunucunun kendisi tarafından anında işlenir. Bundan sonra, herhangi bir sökme, yürütme, değişiklik yapabilirsiniz. Bütün bunlar, nesne işleme işleminin en karmaşık etkilerini oluşturan DDL operatörü tarafından cevaplanır. Ve tüm bunlar çok hızlı olur ve sunucu aslında yüklenmedi. Bu hız ve performans, kullanıcıdan sunucuya büyük miktarda bilgiyi çok hızlı bir şekilde iletmenize ve bunun tersi de geçerlidir.

Bu teknolojiyi uygulamak için çeşitli programlar vardır. Bunlar, örneğin, ORACLE, PSQL'ten Interbase ve Firebird sistemlerinde PL / SQL, klasik "Microsoft" Transact-SQL dahildir. Hepsinde, büyük veritabanı işleyicilerinin kendi algoritmalarını kullanmalarını sağlayan saklı yordamlar oluşturması ve gerçekleştirilmesi amaçlanmıştır. Bu, bu bilgileri yönetenler için gereklidir, tüm nesneleri üçüncü taraf kişilerin izinsiz erişiminden koruyabilir ve buna göre, belirli verileri oluşturma, değiştirme veya silme.

Üretkenlik

Bu veritabanı nesneleri çeşitli şekillerde programlanabilir. Bu, kullanıcıların kullandığı yöntem türünü seçmelerini sağlar, bu da en uygun olan, bu da güç ve zaman kazandırır. Ek olarak, prosedürün kendisi işlenir, bu da sunucu ile kullanıcı arasındaki büyük geçici değişim maliyetlerini önler. Ayrıca, modül yeniden programlanabilir ve istenen yöne kesinlikle herhangi bir zamanda değiştirilebilir. Özellikle SQL saklı yordamın başlangıcının başlatıldığı hızın başlatılmasına değerdir: Bu işlem, kendisine benzer diğerlerinden daha hızlı gerçekleşir, bu da onu uygun ve evrensel kılan.

Emniyet

Bu tür bilgi işleme, daha fazla güvenliği garanti eden benzer işlemlerden farklıdır. Bu, diğer kullanıcıların prosedürlere erişiminin tamamen elimine edilmesi nedeniyle sağlanır. Bu, yöneticinin, bilgilerin yakalanması veya veritabanına izinsiz erişiminden korkmadan, bağımsız olarak onlarla işlem yapmasına izin verecektir.

Veri transferi

SQL Sabit Prosedür ile istemci uygulaması arasındaki ilişki parametreleri ve iade edilen değerleri kullanmaktır. Bununla birlikte, depolanan prosedürdeki verilere aktarılamaz, ancak, bu bilgi (çoğunlukla kullanıcının isteğinde) ve SQL için işleme koyulur. Saklı yordamın çalışmasını tamamladıktan sonra, veri paketlerini geri (ancak istenirse, istenirse, istenirse), SQL saklı yordamına çağrı olarak uygulanabilecek çeşitli yöntemleri kullanmaya neden olan uygulamaya, örneğin:

Çıkış türü parametresini kullanarak veri iletimi;

İade operatörünü kullanarak veri aktarımı;

Seçim operatörünü kullanarak veri iletimi.

Ve şimdi bu işlemin içeriden nasıl göründüğünü çözeceğiz.

1. SQL'de Saklanan Bir Prosedür Oluşturma

MS SQL (Yönetim Studio )'da bir prosedür oluşturabilirsiniz. İşlem oluşturulduktan sonra, oluşturma prosedürünün operatör tarafından gerçekleştirildiği programlanabilir bir veritabanı düğümünde listelenecektir. Saklanan SQL prosedürlerini gerçekleştirmek için, nesnenin adını içeren Exec işlemini kullanın.

Prosedür oluştururken, adı ilk önce bir veya daha fazla parametre atanmıştır. Parametreler isteğe bağlı olabilir. Parametrelerden sonra, yani, prosedürün gövdesi yazılacak, bazı gerekli işlemleri yerine getirmeniz gerekir.

Gerçek şu ki, vücudun içinde bulunan yerel değişkenlere sahip olabileceği ve bu değişkenler yerel ve prosedürlere göre. Başka bir deyişle, yalnızca Microsoft SQL Server Prosedürünün gövdesinde değerlendirilebilirler. Bu durumda saklı prosedürler yerel olarak kabul edilir.

Böylece, bir prosedür oluşturmak için, prosedürün adına ve prosedürün gövdesi olarak en az bir parametreye ihtiyacımız var. Lütfen bu durumda mükemmel bir seçeneğin, prosedürün sınıflandırıcıdaki şema adıyla oluşturulması ve yürütüldüğünü unutmayın.

Prosedürün gövdesi, bir tablo oluşturmak, bir veya daha fazla masa satırını yerleştirin, veritabanının türünü ve karakterini ayarlamak gibi herhangi bir örneğe sahip olabilir. Bununla birlikte, prosedürün gövdesi, içindeki bazı işlemlerin yürütülmesini sınırlar. Önemli kısıtlamaların bazıları aşağıda listelenmiştir:

Vücut başka bir saklı yordam oluşturmamalıdır;

Vücut, nesnenin yanlış bir anlayışını oluşturmamalıdır;

Vücut herhangi bir tetikleyici oluşturmamalıdır.

2. Değişkeni prosedürün gövdesine takma

Vücut prosedürü için yerel değişkenler yapabilirsiniz ve daha sonra yalnızca prosedürün vücudunda olacaklar. İyi uygulama, saklı yordamın vücudunun başlangıcında değişkenler oluşturmaktır. Ancak, bu nesnenin vücudundaki herhangi bir yerinde değişkenleri de ayarlayabilirsiniz.

Bazen birkaç değişkenin bir satırda kurulu olduğunu görebilirsiniz ve her değişken parametresi virgülle ayrılır. Ayrıca, değişkenin @ ön eki olduğunu unutmayın. Prosedürün gövdesinde, istediğiniz değişkeni ayarlayabilirsiniz. Örneğin, @ Name1 değişkeni, prosedürün gövdesinin sonuna daha yakın ilan edilebilir. Açıklanan değişkenin değerini atamak için bir dizi kişisel veri kullanılır. Bir satırda birden fazla değişken ilan edildiğinde durumun aksine, böyle bir durumda yalnızca bir kişisel veri kümesi kullanılır.

Genellikle, kullanıcılar bir soru soruyor: "İşlemin gövdesinde bir operatörde birden fazla değer atanır mı?" İyi. Soru ilginç, ama ne düşündüğünüzü yapmak çok daha kolay. Cevap: "Var \u003d değeri seçin" gibi buharı kullanarak Bu çiftleri kullanabilir, virgüllerini ayırabilirsiniz.

Çok çeşitli örneklerde, insanlar basit bir saklı yordamın oluşturulmasını ve çalıştırılmasını göstermektedir. Bununla birlikte, prosedür bu parametreleri bu parametreleri, bunun için yakın değerleri (ancak her zaman değil) sahip olacak şekilde alabilir. Eşleşirlerse, karşılık gelen işlemler vücudun içinde başlar. Örneğin, şehri ve bölgeyi arayandan alacak bir prosedür oluşturursanız ve kaç tane yazarın karşılık gelen şehre ve bölgeye atıfta bulunur. Prosedür, örneğin yazarların sayımını gerçekleştirmek için, örneğin, PB'ler, Pub'ların yazarlarının tablosunu talep edecektir. Bu veritabanları elde etmek için, örneğin, Google SQL betiğini SQL2005 sayfasından yükler.

Önceki örnekte, prosedür iki parametre alır. ingilizce dili Koşullu olarak @state ve @city olarak adlandırılacaktır. Veri türü, uygulamada tanımlanan türe karşılık gelir. Prosedürün gövdesi, iç değişkenlere sahiptir (toplam yazarlar) ve bu değişken miktarlarını görüntülemek için kullanılır. Her şeyi sayar, aşağıdaki seçim bölümü belirir. Son olarak, hesaplanan değer, baskı ifadesini kullanarak çıktı penceresinde görüntülenir.

SQL'de saklı bir prosedür nasıl gerçekleştirilir

Prosedürü gerçekleştirmenin iki yolu vardır. İlk yol, parametreleri geçerken, virgülle ayrılan liste, prosedür adından sonra yürütülür. Diyelim ki iki değerimiz var (önceki örnekte olduğu gibi). Bu değerler @STate ve @City prosedürünün parametre değişkenleri kullanılarak toplanır. Parametreler iletme yönteminde, sipariş önemlidir. Bu yöntemin olağan argümanların transferi denir. İkinci yöntemde, parametreler zaten doğrudan atanmıştır ve bu durumda sipariş önemli değildir. Bu ikinci yöntem, adlandırılmış argümanların transferi olarak bilinir.

Prosedür, tipik olarak biraz saplanabilir. Stlicely, önceki örnekte olduğu gibi, ancak sadece burada parametreler kaydırılır. Yani, @City parametresi önce saklanır ve @State varsayılan değerin yanında saklanır. Varsayılan parametre genellikle ayrı ayrı ayrılır. SQL saklı yordamlar basit parametreler olarak geçer. Bu durumda, UT parametresinin varsayılan "CA" yerine geçmesi şartıyla. İkinci yürütmede, @City parametresi için argümanın sadece bir değeri geçer ve @State parametresi varsayılan "CA" alır. Deneyimli programcılar, varsayılan olarak tüm değişkenlerin parametre listesinin sonuna yaklaştığını tavsiye eder. Aksi takdirde, yürütme mümkün değildir ve daha sonra adlandırılmış argümanların transferi ile çalışmanız gerekir, bu da daha uzun ve daha zor.

4. Saklanan SQL Server Prosedürleri: İade Yöntemleri

Üç vardır Önemli bir şekilde Saklanan depolanan prosedüre veri gönderme. Aşağıda listelenmiştir:

Saklı yordamın değerini iade edin;

Saklı yordamların çıktısı;

Saklı yordamlardan birinin seçimi.

4.1 SQL Saklı Prosedür Değerlerinin İadesi

Bu teknikte, prosedür yerel değişkenin değerini atar ve iade eder. Prosedür ayrıca sabit bir değer döndürebilir. Aşağıdaki örnekte, toplam yazar sayısını döndüren bir prosedür oluşturduk. Bu prosedürü öncekilerle karşılaştırırsanız, baskı değerinin tam tersi ile değiştirildiğini görebilirsiniz.

Şimdi prosedürü nasıl yapacağınızı görelim ve iade edilen değeri gösterelim. Prosedürün yürütülmesi, tüm işlemden sonra gerçekleştirilen bir değişken ve yazdırmanın kurulmasını gerektirir. Lütfen, yazdırma ifadesi yerine, Operator'u, örneğin, @retvalue seçeneğinin yanı sıra OptionValue'u seçebilirsiniz.

4.2 SQL Saklanan Prosedür Parametre Çıkışı

Yanıt değeri, önceki örnekte gördüğümüz bir değişkeni iade etmek için kullanılabilir. Çıkış parametresinin kullanılması, işlemin arayan için bir veya daha fazla değişken değer göndermesine izin verir. Çıkış parametresi, bir prosedür oluştururken bu anahtar kelimeyle "çıktı" olarak belirtilir. Parametre çıkış parametresi olarak belirtilirse, prosedürün nesnesi için bir değer atamalıdır. SQL depolanan prosedürler, örnekler aşağıda görülebilecek, bu durumda nihai bilgi ile iade edilir.

Örneğimize göre, iki çıkış adı olacaktır: @totalathors ve @totalnocontract. Parametreler listesinde belirtilirler. Bu değişkenler, prosedürün gövdesinde değerler atar. Çıkış parametrelerini kullandığımızda, arayan, prosedürün gövdesi içindeki değeri görebilir.

Ek olarak, önceki senaryoda, MS SQL Server saklı yordamları çıktı parametresinde belirleyen değerleri gördüğü değerleri gördüğü iki değişken. Daha sonra prosedür, "CA" parametresinin normal değerini sunarak gerçekleştirilir. Aşağıdaki parametreler çıktıdır ve bu nedenle bildirilen değişkenler öngörülen şekilde iletilir. Değişkenleri geçerken, çıkış anahtar sözcüğü de burada ayarlandığını lütfen unutmayın. İşlem başarıldıktan sonra, çıkış parametreleri tarafından döndürülen değerler Mesajlar penceresinde görüntülenir.

4.3 SQL Sabit Prosedürlerinden birini seçme

Bu teknik, değer kümesini bir veri tablosu (kayıt kümesi) olarak, saklı saklı yordamaya geri dönmek için kullanılır. Bu örnekte, @Authid parametrelerine sahip SQL saklı yordamı, bu @Authid parametresini kullanarak iade girişlerini filtreleyerek "yazarlar" tablosunu ister. SELECT ifadesi, arama saklı yordamına geri döndürülmesi gerektiğine karar verir. Saklı yordamın yürütülürken, AuthID geri iletilir. Böyle bir prosedür burada her zaman yalnızca bir girişi veya herhangi birini döndürür. Ancak saklı yordam, birden fazla kayıtın geri dönüşünde herhangi bir kısıtlamaya sahip değildir. Genellikle, seçilen parametreleri kullanan verilerin geri dönüşünün, hesaplanan değişkenlerin katılımıyla kullanıldığı, birkaç sonuç değeri sağlayarak oluştuğu örnekleri bulabilirsiniz.

En sonunda

Saklı yordam, istemci uygulaması sayesinde gerekli değişkenleri kurmanın yanı sıra geri dönen veya ileten oldukça ciddi bir yazılım modülüdür. Sabit prosedür sunucuya yapıldığından, sunucu ile istemci uygulaması (bazı hesaplamalar için) arasındaki büyük hacimlerde veri alışverişi kaçınılabilir. Bu, elbette sahiplerinin eline giden SQL Server'daki yükü azaltmanıza olanak sağlar. Alt türlerden biri T SQL prosedürleri saklanır, ancak etkileyici veritabanlarının oluşturulmasıyla uğraşanlara çalışmaları gerekir. Ayrıca, depolanan prosedürleri incelemesiyle faydalı olabilecek çok sayıda nüans bile vardır, ancak profesyonel olarak da dahil olmak üzere programlamaya sıkıca katılmayı planlayanlar için daha fazla gereklidir.

Saklı yordamlar

Bu bölümün konusu, iş mantıksal saklı yordamları uygulamak için veritabanı uygulama geliştiricilerini (İngilizce, Stoied prosedürleri) uygulamak için verilen en güçlü araçlardan biridir (İngilizce, Stoied Prosedues), uygulama mantığının önemli bir bölümünü veritabanı düzeyinde önemli bir parçası uygulamanıza izin verir ve böylece performansı arttırır. Tüm uygulamanın tümü, veri işleme merkezileştirin ve neredeyse yeterince karmaşık veritabanı uygulamasını gerçekleştirmek için görevleri gerçekleştirmek için gereken kod sayısını azaltın, saklı yordamların kullanımı olmadan çalışmaz.
Depolanan prosedürlerin kullanılmasının bu iyi bilinen avantajlarına ek olarak, çoğu ilişkili DBM'ler için ortak, interbase depolanan prosedürler, geleneksel SQL sorgularında döndürülen sonuçları kullanmalarını sağlayan pratik olarak tam veri kümelerinin rolünü oynayabilir.
Genellikle, acemi geliştiriciler, depolanan prosedürleri, veritabanının içindeki bir şeyi yapan belirli bir SQL sorguları olarak saklıdır ve saklı yordamlarla çalışmak için, müşteri uygulamasında aynı işlevi uygulamaktan çok daha zor bir bakış açısı var. Seviye Dili
Peki, Interbase'deki saklı yordamlar nelerdir?
Saklı yordam (CP), Derleyici Inteibase Sunucusu'nun çekirdeğine yerleşik olan özel bir dilde yazılı olan Interbase alt yordamının iç gösterimine derlenen veritabanı meta verilerinin bir parçasıdır.
Saklanan prosedürden kaynaklanabilir müşteri Uygulamaları, tetikleyicilerden ve diğer saklı prosedürlerden. Sabit prosedür, sunucu işleminin içinde gerçekleştirilir ve veritabanındaki verileri manipüle edebilir ve ayrıca sonuçlarını istemciye iade edebilir (T e tetiği, HP, Ek)
HP cinsinden yayılan güçlü özelliklerin temeli, ekstra, güncelleme ve seçme gibi geleneksel SQL'in değiştirilmiş önerileri olarak bileşiminde olan prosedürel bir programlama dilidir ve dallanma ve döngüler (ise, eğer) Hata işleme aletleri olarak. Ve istisnai durumlar saklı yordamların dili, karmaşık veri ve veri algoritmalarının uygulanmasına izin verir ve ilişkisel veriler CPS ile çalışmanın oryantasyonu nedeniyle, geleneksel dillerde benzer prosedürlerle çok daha kompakt.
Bir dizi özellik ve kısıtlama hariç, aynı programlama dilinin tetikleyici için kullanıldığı belirtilmelidir. Tetikleyicilerde kullanılan dilin alt kümesinin farklılıkları, "tetikleyiciler" bölümünde ayrıntılı olarak değerlendirilir (Bölüm 1).

Basit saklı yordam örneği

İlk saklı yordam oluşturma ve saklı yordamlar oluşturma sürecini inceleme zamanı. Ancak bir başlangıç \u200b\u200biçin, depolanan prosedürlerle nasıl çalışılacağı hakkında birkaç kelime söylenmesi gerektiği söylenmelidir, gerçeği düşük dokunuşlu ve uygunsuz bir hp aracının zaferi, depolanan gelişmekte ve hata ayıklamanın son derece düşük standart anlamına gelmesidir. prosedürler. INTERBASE belgelerinde, bir ISQL tercümanının girişine beslenen, HP'nin metnini içeren SQL script dosyalarını içeren prosedürler oluşturulması önerilir ve böylece bu SQL betiğinde HP'nin oluşturulmasını ve değiştirilmesini sağlar. BLR'teki prosedürün metninin tasarımı (O BLR CM "Bölüm" Birleşik Veritabanı Yapısı "(Bölüm 4)) Bir hata oluşacaktır, ISQL, bu hata oluşan SQL komut dosyası dosyasının hangi satırında oluşur. Hatayı düzeltin ve önce her şeyi tekrarlayın. Bu kelimenin modern bir anlayışında hata ayıklama hakkında, yani, icra izi hakkında, değişkenlerin orta değerlerini görme yeteneğiyle, hiç konuşmuyoruz. Açıkçası, böyle bir yaklaşım, geliştiricinin gözlerinde saklı yordamların çekiciliğinin büyümesine katkıda bulunmuyor.
Bununla birlikte, HP'nin gelişimine standart minimalist yaklaşıma ek olarak<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
Saklanan prosedürlerin sözdizimi aşağıdaki gibidir:

Prosedür adını oluşturun.
[(Param DataType [, Param DataType ...])]
)]
Gibi
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
Varlığın Varlığını Döndürün;

=
Başla.
< compound_statement>
[< compound_statement> ...]
Son.
< compound_statement> = ( Beyan;)

Oldukça büyük ve belki akıllıca görünüyor, ancak aslında her şeyin yavaş yavaş sözdizimini ustalaşması çok kolaydır, yavaş yavaş karmaşık örnekleri görelim.
Bu nedenle, burada girişte iki sayı alan, onları katlayan ve elde edilen sonucu geri döndüren çok basit bir saklı yordamın örneğidir:

Prosedür oluşturma sp_add (First_Arg çift hassasiyet,
second_arg çift hassasiyet)
Dönüşler (sonuç çift indirim)
Gibi
Başla.
Sonuç \u003d first_arg + second_arg;
Askıya almak;
Son.

Gördüğünüz gibi, her şey basittir: Oluşturma Prosedürü komutundan sonra, yeni oluşturulan prosedürün adı (veritabanında benzersiz olmalıdır) - bu durumda, sp_add, sonra virgül içindeki parantez içinde, giriş HP - First_ARG ve Second_ARG'nin parametreleri listelenir - türlerini gösterir.
Giriş parametrelerinin listesi, Yarat Prosedürü bildiriminin isteğe bağlı bir parçasıdır - iş prosedürü için tüm verilerin prosedürün gövdesi içindeki tabloların istekleri aracılığıyla aldığı durumlar vardır.

Saklanan prosedürlerde, herhangi bir skaler veri türü, kullanıcı tarafından tanımlanan dizilerin ve türlerin kullanılmasıyla kullanılır.

Sonraki, anahtar kelime döndürür, ardından, iade parametrelerinin türlerini belirlemekle parantez içinde listelenmiştir - bu durumda sadece bir sonuçtur.
Prosedür parametreleri döndürmemesi gerekirse, kelime geri dönüşleri ve iade edilen parametrelerin listesi eksiktir.
Dönüştürün ardından, anahtar kelime belirtilir. Gittikçe anahtar kelimeye başlıkve sonra - techo.prosedürler.
Saklı yordamın gövdesi, iç (yerel) değişkenlerinin açıklamalarının bir listesidir (varsa, daha fazlasını düşünüyoruz. Bu durumda, HP'nin gövdesi çok basittir - iki giriş argümanı istedik ve sonuç çıktılarını atayın ve ardından Askıya Alma komutunu arayın. Biraz daha sonra, bu ekibin eyleminin özünü açıklığa kavuşturuyoruz, ancak şimdilik, döndürülen parametrelerin saklı yordamın neden olduğu yere aktarmanın gerektiğini unutmayın.

Saklı yordamlarda ayrılır

Lütfen prosedürün içindeki operatörün bir noktalı virgülle (;) bittiğini unutmayın. Bildiğiniz gibi, bir noktalı virgül SQL'de standart bir komut ayırıcısıdır - komut metninin tamamen girildiği ve işleme koymaya başlamanız gereken bir SQL tercüman sinyalidir. HP'nin ortasında bir virgülle bir nokta bularak, SQL tercümanı komutun tamamen girildiğini ve saklı yordamın bir parçasını yapmaya çalıştığını düşünmelerini sağlayamaz. Bu varsayım anlamdan yoksun değildir. Nitekim, yukarıdaki örneği yazmak için bir dosya oluşturursanız, veritabanından bir bağlantı komutu ekleyin ve bu SQL komut dosyasını bir ISQL tercümanı kullanarak, yorumlamanın, oluşturma komutunun sonuna göre beklenmedik bir hata ile ilişkili bir hata kullanarak çalıştırmayı deneyin. Saklanan yordam döndürülecek. SQL script dosyalarını kullanarak, özel InterBase Developer araçlarının kullanımı olmadan saklı yordamlar oluşturursanız, script komutu ayırıcısını, noktalı virgülden farklı olan başka bir sembolle değiştirebilmeniz gerekir. Metin XP geri yükleyin. ISQL komutu, SQL tekliflerini değiştiren, şöyle görünüyor:

Terim

Saklı bir prosedür oluşturmanın tipik bir örneği için şöyle görünür:

Terimi ^;
PROSEDÜR YARATIŞ SERT_PROCEDURE.
... . .
Son.
^
Dönemi ayarla; ^

Saklı yordam çağırın

Ancak saklı yordamımıza geri dönün. Şimdi yaratıldığı, bir şekilde adlandırılmalı, parametrelerine aktarılmasını ve sonuçları iade edilmelidir. Bunu yapmak çok kolaydır - sadece aşağıdaki formun bir SQL isteğini yazın:

Seç *
SP_ADD'den (181.35, 23.09)

Bu sorgu, 181.35 ve 23.09 sayısının, yani 204.44 sayısının olacağı sadece bir sonuç alanı içeren bir satıra geri dönecektir.
Böylece prosedürümüz sıradan kullanılabilir SQL-Taleplergibi koşmak müşteri programlarıve diğer HP veya tetikleyicilerde. Prosedürümüzün bu kullanımı, saklı yordamın sonunda askıya alma komutunun kullanımı nedeniyle mümkün olmuştur.
Gerçek şu ki, Interbase (ve tüm klonlarında) iki tür depolanan prosedür vardır: seçilebilir prosedürler ve yürütülebilir prosedürler (yürütülebilir prosedürler). Bu iki HP türünün çalışmasındaki fark, örnekleme prosedürlerinin genellikle bir tür veri setine sahip olan satırla gruplandırılan birçok sayı kümesini döndürmesi ve çalıştırılabilir prosedürler olabilir) t ya da parametreleri iade edemez veya geri dönmemesidir. Bir dizi parametre dizisi olan karşılığında listelenen yalnızca bir tane çıkış parametresi kümesi. Örnekleme prosedürleri, Yürütme Prosedür komutunu kullanarak - Seçim İstekleri ve Yürütülebilir Prosedürlerde çağrılır.
Her iki depolanan prosedür tipi de aynı oluşturma sözdizimine sahiptir ve resmi olarak farklı değildir, bu nedenle herhangi bir geliştirme prosedürü bir seçim isteği ve herhangi bir örnekleme prosedüründe - Uygulama Prosedürü kullanılarak çağrılabilir. Soru, HP'nin ne zaman davranacağını farklı şekiller Aramak. Başka bir deyişle, fark, belirli bir arama türü için prosedürün tasarımında yatmaktadır. Yani, örnekleme prosedürü özel olarak Seçme İsteğinden çağırmak için oluşturulur ve yürütülebilir prosedür, yürütme prosedürünü kullanarak aramaktır. Bu iki tür HP'nin tasarımındaki farklılıkların ne olduğuna bakalım.
Numune prosedürünün nasıl çalıştığını anlamak için teoriye derinden gitmek zorunda kalacaksınız. SELECT ID'nin normal SQL sorgusunu, Table_Example'daki adının normal SQL sorgusunu hayal edin. Yürütülmesi sonucunda, iki sütun (ID ve Ad) ve belirli sayıda dizden (Tablo_Example'daki satır sayısına eşit) oluşan çıktında bir tablo elde ediyoruz. Bu talebin bir sonucu olarak döndürülen tablo da SQL veri seti olarak adlandırılır, bu istek sırasında veri setinin nasıl oluşturulduğunu, bir istek aldığım, hangi tabloların atıfta bulunduğunu belirler, daha sonra bu tablolardan hangi kayıtların alt kümesini bulur. sorgu sonucuna dahil edilmelidir. Daha sonra sunucu, sorgunun sonuçlarını karşılayan her kaydı okur, gerekli alanları seçer (durumumuzda kimlik ve isim) ve bunları müşteriye gönderir. İşlem daha sonra tekrar tekrarlanır - ve böylece seçilen her giriş için.
Tüm bu geri çekilme, tüm SQL veri kümelerinin tüm SQL veri kümelerinin, saklı yordamlarda da dahil olmak üzere satırla çizgiler oluşturulduğunu anlaması için gereklidir! Yürütülebilir prosedürlerden gelen numune prosedürleri arasındaki ana fark, birincinin bir dizi dizeyi ve ikincisi için bir dizi iade etmek için tasarlandığıdır. Bu nedenle, farklı şekillerde kullanılırlar: Numune prosedürü, iade edilebilecek tüm kayıtları vermek için prosedürden "gerektiren" SELECT komutu kullanılarak denir. Yürütülebilir prosedür, CP'den yalnızca bir satırdan "çıkan" olan yürütme prosedürü kullanılarak denir.
Net olarak örnekleme prosedürünün bir örneğini görelim. For (affetme), ID, Scely ID isteği ile aynı şekilde çalışan saklı bir prosedür oluşturun, Table_Example'dan ad, T e Kimliğini ve ad alanı örneğini tüm tablodan yapar. İşte bu örnek:

Prosedür oluştur simple_select_sp.
İadeler (
procid Tamsayı,
procname varchar (80))
Gibi
Başla.
İçin
ID'yi seçin, Tablo_Example'dan Adınız
İçine: ProcID ,: procname
Yapmak.
Başla.
Askıya almak;
Son.
Son.

Simple_select_sp adlı bu prosedürün eylemlerini analiz edelim. Gördüğünüz gibi, giriş parametreleri yoktur ve iki çıkış parametresi var - kimliği ve adıdır. Elbette en ilginç olan, prosedürün vücudunda sonuçlandırılmıştır. Burada Seçim Tasarım için kullanılır:

İçin
ID'yi seçin, Tablo_Example'dan Adınız
İçine: ProcID ,: procname
Yapmak.
Başla.

/ * Procid ve procname değişkenleriyle yaptığımız bir şey * /

Son.

Bu kod parçası aşağıdaki anlamına gelir: Tablo_Example tablosundan seçilen her satır için, seçilen değerleri ProcID ve ProcName değişkenlerine yerleştirin ve ardından bu değişkenlerle bazı adımlar atın.
Şaşırmış bir yüz kazandırabilir ve sorabilirsiniz: "Değişkenler? Diğer Değişkenler 9", bu bölümün bir sürpriz gibi bir şeydir - saklı yordamlarda değişkenleri kullanabileceğimizi. HP dilinde, hem kendi yerel değişkenlerinizi prosedür içinde ilan edebilir ve giriş ve çıkış parametrelerini değişken olarak kullanabilirsiniz.
Yerel bir değişkeni saklı yordamda ilan etmek için, açıklamasını anahtar sözcüğünden sonra ve ilk kelime başlamasından önce yerel değişkenin açıklamasından önce şöyle görünmek gerekir:

Değişken ilan etmek. ;

Örneğin, bir tamsayı yerel değişkeni bildirmek için MyLnt, arası eklemeniz gerekir ve aşağıdaki açıklamaya başlamanız gerekir.

Değişken mylnt tamsayı ilan etmek;

Örneğimizdeki değişkenler bir kolonla başlar. Bu yapılır, çünkü kendilerine yapılan başvuru SECT SQL komutunun içine girer, bu nedenle seçimde kullanılan tablolardaki alanları ayırt etmek ve değişkenler son kolonu hazırlamalıdır. Sonuçta, değişkenler tablolardaki alanlar ile aynı ada sahip olabilir!
Ancak, değişken adından önce kolon sadece SQL sorgularında kullanılmalıdır. Dış metinler, değişkene erişim bir kolon olmadan yapılır, örneğin:

procname \u003d "bazı isim";

Ancak prosedürümüzün vücuduna geri dönün. Seçme teklifi, bir tablo - veri kümesi ve bir satır biçiminde olmayan verileri döndürür. Her döndürülen alan değişkenine yerleştirilmelidir: id \u003d\u003e ocid, ad \u003d\u003e procname. Yayın açısından, bu değişkenler, askıya alma komutunu kullanarak istemciye gönderilir) İşlemler\u003e p\u003e
Böylece, seçilen ... Yapma komutu, çevrimi bu komutun seçim bölümünde seçilen kayıtlarla düzenler. Yapılanların bir parçası tarafından oluşturulan döngü gövdesinde, bir sonraki oluşturulan kayıt, askıya alma komutunu kullanarak müşteriye iletilir.
Böylece, örnek prosedür, elde edilen parametreler-değişkenleri dolduran bir döngü vücudun içinde düzenlenen bir veya daha fazla satır döndürmek için tasarlanmıştır. Ve bu döngünün vücudunun sonunda, askıya alma komutu mutlaka buna değerdir, bu da bir sonraki veri satırını istemciye iade edecektir.

Döngü ve Şube Operatörleri

Seçim ... seçeneğine ek olarak, herhangi bir numunenin kayıtlarında bir döngü düzenlemek için, başka bir döngü türü vardır - bu, herhangi bir koşulun kontrolüne dayanan bir döngü düzenlemenizi sağlayan başka bir döngü türü vardır. İşte, süre kullanılarak HP'nin bir örneği. Bu prosedür, tamsayıların karelerini 0 ila 99 arasında döndürür:

ProsectJre Quad'i oluşturun.
İadeler (Quadrat Intreger)
Gibi
Değişken i tamsayısında ilan etmek;
Başla.
İ \u003d 1;
Süre (I.<100) DO
Başla.
Quadrat \u003d i * ben;
İ \u003d i + 1;
Askıya almak;
Son.
Son.

Dörtlü isteğin seçiminin bir sonucu olarak, 1 ila 99 arasında bir tam sayı karesi olacak bir Quadrat sütunu içeren bir tablo alacağız.
SQL örneklemesinin ve klasik çevrimin arama sonuçlarına ek olarak, eğer operatör, sözdiziminin herhangi bir \\ kelimesinin yürütülmesine bağlı olarak dallanma düzenlemenizi sağlayan saklı yordam dilinde kullanılır. - Pascal ve Si gibi seviye programlama dilleri.
Aşağıdakileri yapan saklı yordamın daha karmaşık bir örneği olduğunu düşünelim.

  1. Table_example tablosundaki ortalama fiyatı hesaplar (bkz. "Tablo Birincil Anahtarları ve Jeneratörler")
  2. Ardından, masadaki her giriş için, parça\u003e Yusch'u yaparsa, mevcut bir fiyat (fiyat) daha ortalama fiyat ise, fiyatı ortalama fiyatın büyüklüğüne eşit, artı tanımlanmış sabit yüzdeye sahiptir.
  3. Mevcut fiyat ortalama fiyata eşit veya ona eşitse, fiyatı eski fiyata eşit, artı eski ve ortalama fiyat arasındaki farkın yarısı kadardır.
  4. Tablodaki tüm değiştirilmiş satırları döndürür.

Başlamak için, HP'nin adını tanımlarız ve giriş ve çıkış parametreleri, tüm bunların saklı yordamın başlığında reçete edilir.

Prosedür artışları oluşturun (
Yüzde2Lncrease çift hassasiyet)
İade (ID tamsayı, isim varchar (so), new_price çift
Hassas) olarak

Prosedürün artış olarak adlandırılacağı, çift hassasiyet türüne ve 3 çıkış parametresine sahip olan 3 çıkış parametresine sahip bir Peiceni21Nciese giriş parametresine sahiptir. Lütfen, ilk iki çıkış parametresinin, Tablo_Example tablosundaki alanlarla aynı isimler olduğu, bununla birlikte çalışacağımız, saklı yordamların kurallarına izin verilir.
Şimdi, ego beyannamesinin ortalama değerini depolamak için kullanılacak yerel bir değişkeni beyan etmeliyiz:

Değişken avg_price çift hassasiyetini bildirmek;

Şimdi HP'nin gövdesini açmak için saklı yordamın vücuduna dönüyoruz. anahtar Kelime Başlıyor.
İlk olarak, algoritmamızın ilk adımı yerine getirmemiz gerekiyor - ortalama fiyatı hesaplar. Bunu yapmak için aşağıdaki tür için talebi kullanacağız:

AVG (Fiyat_L) seçeneğini belirleyin
Table_Example'dan
İçine: avg_price, -

Bu sorgu, seçilen sorgu satırları arasındaki fiyat_1 alanının ortalama değerini döndüren AVG agrega işlevini kullanır. Döndürülen değer, AVG_Price değişkenine yerleştirilir. Lütfen AVG_PNCE değişkeninin bir kolondan önce geldiğine dikkat edin - sorguda kullanılan alanlardan ayırt etmek için.
Bu talebin bir özelliği, her zaman tek bir tek girişe geri dönmesidir. Bu tür sorular, Singleton istekleri olarak adlandırılır ve yalnızca bu tür numuneler saklı yordamlarda kullanılabilir. İstek birden fazla satırda dönerse, her döndürülen satırı işleme koymak için bir döngü düzenleyen seçme formunda yayınlanmalıdır.
Yani, ortalama fiyat değerini aldık. Şimdi tüm masanın içinden geçmeniz, fiyatın değerini ortalama fiyatla her bir kayıtta karşılaştırın ve uygun işlemler yapın
Başlangıçtaki opganize, Tablo_Example'dan her girişin kaba kuvveti

İçin
Kimliğinizi seçin, ad, fiyat_1
Table_Example'dan
İçine: ID ,: İsim ,: New_Price
Yapmak.
Başla.
/ * _ Burada her kayıttan korduk * /
Son.

Bu tasarım Table_Example tablosundan yürütüldüğünde, her satırdaki veri ve saha değerleri, her satırdaki kimliğe, ad ve yeni_pnce değişkenlerine atanacaktır. Tabii ki, bu değişkenlerin çıktı parametreleri olarak ilan edildiğini unutmayın, ancak seçilen verilerin sonuçlar olarak iade edileceği için endişelendirmeyin: çıkış parametrelerinin herhangi bir şeye atanması, arayan müşterinin yapacağı anlamına gelmez Hemen bu değerleri alın! Parametre şanzımanı, yalnızca askıya alma komutu yürütüldüğünde ve çıktı parametrelerini geleneksel değişkenler olarak kullanabilmemiz için gerçekleştirilir - örneğimizde, yeni_price parametresiyle yaptığımız gibi.
Yani, başlama döngüsü gövdesi içinde. Send her satırın değerlerini işleyebiliriz. Hatırladığınız gibi, mevcut fiyatın ortalama ile nasıl ilişkili olduğunu ve uygun eylemleri aldıklarını öğrenmemiz gerekir. Bu karşılaştırma prosedürünü bir operatörü kullanarak uyguluyoruz:

IF_Price\u003e avg_price) o zaman / * Mevcut fiyat ortalama fiyattan daha büyükse * /
Başla.
/ * sonra yükleyin yeni fiyatOrtalama fiyatın büyüklüğüne eşit, artı sabit bir yüzde * /
new_price \u003d (AVG_Price + AVG_Price * (Yüzde2Orlan / 100));
Table_example güncelleyin
Set price_1 \u003d: new_price
Burada id \u003d: kimliği;
Son.
BAŞKA.
Başla.
/ * Mevcut fiyat ortalama fiyata eşit veya daha az ise, fiyatı eski fiyata eşit, artı eski ve orta fiyat arasındaki farkın yarısı * /
new_price \u003d (NEW_PNCE + ((AVG_PNCE new_price) / 2);
Table_example güncelleyin
Set price_1 \u003d: new_price
Nerede id \u003d .id;
Son.

Gördüğünüz gibi, semboller / ** / / / ** / /.
Fiyatı hesaplanan farka göre değiştirmek için, mevcut kayıtları değiştirmenizi sağlayan güncelleme operatörünü kullanacağız - bir veya daha fazla. Fiyatı değiştirmeniz gereken hangi kaydı kesinlikle belirtmeniz için, kimlik değerinin depolandığı değişken değeri ile karşılaştıran durum şirketinde birincil anahtar alanını kullanıyoruz. şuan ki kayıt: ID \u003d: ID. Kimlik değişkeninin bir kolondan önce geldiğine dikkat edin.
Eğer iftasın tasarımından sonra ... o zaman ... ID değişkenlerinde, ad ve new_price, prosedüre neden olan müşteriyi \\ iade etmeniz gereken verilerdir. Bunu yapmak için, usul komutunu eklemek gerekirse, prosedürün bulunduğu yerden verilen verilerin bulunduğu ve yeni bir giriş gerektiğinde, tekrar devam ederken, tekrar devam edecekse, tekrar devam edecektir ve Bu yüzden seçime kadar devam edecek ... İsteğinin tüm kayıtlarını uyandırmayacak.
Sortkud komutuna ek olarak, yalnızca saklı yordamın etkisini durduran, satır iletiminden sonra saklı yordamı durduran bir çıkış komutu var olduğu belirtilmelidir. Bununla birlikte, çıkış ekibi nadiren nadir görülür, çünkü çoğunlukla herhangi bir koşul elde ederken döngüsünü kesmek için gereklidir.
Bu durumda, prosedür seçme ifadesi tarafından çağrıldığında ve çıkışla tamamlandığında, son çıkarılan satır iade edilecektir. Yani, prosedürü kesmeniz gerekirse ve hala\u003e Bu dizgiyi almanız gerekirse, sırayı kullanmanız gerekir.

Askıya almak;
Çıkış;

Çıkışın asıl amacı, uygulama prosedürünü arayarak parametreler tarafından iade edilen Singleton veri kümelerinin alınmasıdır. Bu durumda, çıkış parametrelerinin değerleri ayarlanır, ancak SQL veri seti oluşturulmaz ve prosedür tamamlanır.
Saklanan prosedürümüzün metnini tamamen bir görünümde mantığını kapsayacak şekilde yazalım:

Prosedür artışları oluşturun (
Yüzde, çift hassasiyet yüzdesi)
İadeler (ID tamsayı, isim varchar (80),
new_price çift hassasiyet) olarak
Değişken avg_price çift hassasiyetini bildirmek;
Başla.
AVG (Fiyat_L) seçeneğini belirleyin
Table_Example'dan
İçine: avg_price;
İçin
Kimliğinizi seçin, ad, fiyat_1
Table_Example'dan
İçine: ID ,: İsim ,: New_Price
Yapmak.
Başla.
/ * Burada her kaydı işleriz * /
İf_pnce\u003e avg_price) o zaman / * Mevcut fiyat ortalama fiyattan daha büyükse * /
Başla.
/ * Ortalama fiyatın büyüklüğüne eşit yeni bir fiyat, artı sabit bir yüzde * /
new_price \u003d (avg_price + avg_price * (yüzde2LnCrease / 100));
Table_example güncelleyin
Set price_1 \u003d: new_price
Burada id \u003d: kimliği;
Son.
BAŞKA.
Başla.
/ * Mevcut fiyat ortalama fiyata eşit veya ona eşitse, eski fiyata eşit fiyatı, artı eski ve orta fiyat arasındaki farkın yarısı * /
new_price \u003d (New_Price + ((AVG_Price - New_Price) / 2));
Table_example güncelleyin
Set price_1 \u003d: new_price
Burada id \u003d: kimliği;
Son.
Askıya almak;
Son.
Son.

Saklı yordamın bu örneği, saklı yordamların ve tetikleyicilerin ana tasarımlarının kullanımını göstermektedir. Daha sonra, sık sık ortaya çıkan işleri çözmek için saklı yordamları uygulamanın yollarını düşüneceğiz.

Özyinelemeli saklı yordamlar

INTERBASE saklı yordamlar özyinelemeli olabilir. Bu, saklı yordamdan kaynaklanabileceği anlamına gelir. Bununla birlikte, 1000 seviyeye kadar yuvalanan saklı yordamlara izin verilir, ancak sunucudaki serbest kaynakların daha önce HP'nin maksimum tanımından elde edilebileceğini hatırlamak gereklidir.
Saklanan prosedürlerin ortak uygulamalarından biri, veritabanında depolanan ağaç benzeri yapıların işlenmesidir. Ağaçlar genellikle kompozisyon, depo, personel ve diğer ortak uygulamaların görevlerinde kullanılır.
Belli bir yuvalama seviyesinden başlayarak, belirli bir türün tüm ürünlerini seçen saklı bir prosedürün örneğini göz önünde bulunduralım.
Aşağıdaki görev formülasyonuna sahip olalım: biz bir ürün rehberimiz var hiyerarşik yapı Bu türden:

Ürün:% s
- Aletler
- Buzdolapları
- Üç oda
- İki oda
- Tek kamera
- Çamaşır makineleri
- Dikey
- Frontal
- Klasik
- dar
- Bilgisayar Teknolojisi
....

Ürün kategorilerinin kategorisinin bu yapısı çeşitli derinliklerde dalları olabilir. Ayrıca zamanla büyür. Görevimiz, herhangi bir düğümden başlayarak, referans defterinden "tam adı" ile tüm uç eşyaların bir örneğini sağlamaktır. Örneğin, "çamaşır makineleri" düğümünü seçersek, aşağıdaki kategorileri almamız gerekiyor:

Çamaşır Makineleri - Dikey
Çamaşır Makineleri - Frontal Klasik
Çamaşır Makineleri - Frontal Dar

Malların bilgi rehberini depolamak için tabloların yapısını tanımlarız. Bir ağacın organizasyonu için basitleştirilmiş bir şema kullanıyoruz:

Masa Oluşturma GoodStree
(ID_GOOD tamsayı null değil,
ID_PARENT_GOOD tamsayısı,
Good_Name Varchar (80),
kısıtlama pkgooci birincil anahtar (ID_GOOD));

Sadece 3 alanın bulunduğu tek bir GoodStree tablosu oluşturun: ID_GOOD - Smart Kategori Tanımlayıcısı, ID_Parent_Good - Bu kategori için KSHD-ebeveyn kimliği ve Good_Name Catshinin adıdır. Bu tablodaki verilerin bütünlüğünü sağlamak için, bu tabloları sunuyoruz) harici anahtar kısıtlaması:

Alter table goodstree
Kısıtlama fk_goodstree ekle
YABANCI KEY (ID_PARENT_GOOD)
Referanslar Goodstpee (id__good)

Tablo kendisini ifade eder ve bu harici anahtar monitörler. Böylece, masadaki var olmayan ebeveynlere referans olmaması ve aynı zamanda torunları olan mal kategorilerini kaldırma girişimlerini önler.
Aşağıdaki verileri tablonuza getirelim:

İd_good

1
2
3
4
5
6
7
8
9
10
11
12

İd_parent_good.

0
1
1
2
2
4
4
4
5
5
10
10

İyi isim.

Mal
Aletler
Bilgisayarlar ve Bileşenler
Buzdolapları
Çamaşır makineleri
Üç oda
İki oda
Tek kamera
Dikey
Front
Dar
Klasik

Şimdi bir depolama alanımız var, "Kayıtlı" formundaki tüm "final" formlarının çıktısını gerçekleştiren saklı bir prosedür oluşturmaya başlayabiliriz - örneğin, "üç odalı" tam adı kategorisi için. Kategori "Ev Aletleri Buzdolapları Üç Odası" gibi görünecektir.
Odun yapılarını işleyen saklı prosedürlerde terminolojisi gelişti. Her odun elemanı bir düğüm denir; Ve birbirlerinin düğümlerine atıfta bulunmak arasındaki ilişki ebeveyn soyundan ilişkilerdir. Ağacın sonundaki ve nişan almayan düğümler "yapraklar" denir.
Gözenekli saklı yordamda, giriş parametresi, taramayı başlatmak zorunda kalacağımız kategori tanımlayıcısı olacaktır. Saklı yordam aşağıdaki forma sahip olacaktır:

Prosedür oluşturun getFullname (id_good2show tamsayısı)
İade (full_goods_name varchar (1000),
İd_child_good integer)
Gibi
Curr_Child_Name Varchar (80) değişkenini bildirin;
Başla.
/ * 0ganize harici çevirmek ID_GOOD \u003d ID_GOOD2SHOW * /SHOY *
Seçmek için gtl.id_good, gtl.good_name
GoodStree GTL'den.
Where gtl.id_parent_good \u003d: id_good2show
İçine: Id_Child_Good ,: full_goods_name
Yapmak.
Başla.
/ "Sorgu en az bir satır döndürürse, geçerli olan özellikleri kullanarak kontrol edin. Bulunan düğümün ID_PARENT_GOOD \u003d ID_CHILD_GOOD ile nişan alması yoksa, o zaman bir" sayfa "ağacıysa ve sonuçlara girer * /
Eğer (yok (yok)
Seçmek * goodstree
Where goodstree.id_parent_good \u003d: id_child_good))
Sonra.
Başla.
/ * "Sayfayı" aktarın Ağaç sonuçlarına * /
Askıya almak;
Son.
BAŞKA.
/ * Torunları olan düğümler için * /
Başla.
/ * Ebeveyn düğümünün adını geçici değişkende tutun * /
Curr_child_name \u003d full_goods_name;
/ * Bu prosedürü tekrar açığa çıkarın * /
İçin
ID_Child_Good, Full_Goods_Name Select Select
GetFullName'den (: id_child_good)
İçine: Id_Child_Good ,: full_goods_name
Başla.
/ * Bulunacak vakfa bir düğüm-ebeveyn ekleyin., Satırlık konontin operasyonu yardımı ile soyundan ismi || * /
full_goods_name \u003d curr_child_name | "" | F Ull_Goods_Name, -
Askıya almak; / * Malların tam adını iade edin * /
Son.
Son.
Son.
Son.

Bu prosedürü id_good2show \u003d 1 giriş parametresi ile yürütürsek, aşağıdakileri alacağız:

Gördüğünüz gibi, özyinelemeli saklı yordamı kullanarak, kategori ağacının tamamı etrafında yürüdük ve dalların en fazla ipucu olan "yapraklar" kategorilerinin tam adını getirdik.

Sonuç

Bu, saklı prosedürlerin dilinin ana olanaklarının değerlendirilmesini bitirecektir. Açıkçası, aynı bölümü okurken saklı yordamların geliştirilmesine tam olarak ustalaşmak imkansızdır, ancak burada saklı yordamlarla ilgili temel kavramları sunmaya ve açıklamaya çalıştık. Çoğu veritabanı uygulamasında CPS tasarımı tasarımları ve yöntemleri uygulanabilir.
Depolanan prosedürlerin gelişimi ile ilgili önemli konuların bir kısmı aşağıdaki bölümde - "genişletilmiş dil fırsatları interbase depolanmış prosedürler" nde açıklanacak, istisnaların işlenmesine adanmış, saklı yordamlarda yanlış durumlara izin verir ve dizilerle çalışır.


Üst.