MS SQL prosedürleri. Microsoft sql sunucusunda saklanan prosedürlerin oluşturulması. Kaydedilmiş bir prosedürde RETURN kullanımı

Prosedürünüzdeki satırı açın - SET NOCOUNT ON:

DML virüsünün yardımıyla SQL sunucusu bize derhal çok sayıda işlenmiş kaydı kaldırmamızı söyler. Bu bilgiler kodun geliştirilmesi sırasında bizim için yararlı olabilir, aksi takdirde bundan sonra kesinlikle işe yaramaz olacaktır. SET NOCOUNT ON yazarak bu fonksiyonu etkinleştiriyoruz. Prosedürleri kaydetmek için, bir dizi virüsün veya bu eylemin döngüsünün karıştırılması, üretkenlikte önemli bir artış sağlayabilir, böylece trafik miktarı önemli ölçüde azalacaktır.

Transact-SQL

Nesne adlarıyla birlikte Vikorist şema adları:

Burada akıllıca düşünüyorum. Bu işlem, sunucuya nesneleri araması ve bunun yerine görevleri arasında sorunsuz bir şekilde ilerlemesi talimatını verir, böylece nereye gitmemiz gerektiğini ve ne almamız gerektiğini biliriz. Kaydedilen çok sayıda veri tabanı, tablo ve prosedür sayesinde zamandan ve sinirlerimizden önemli ölçüde tasarruf sağlayabilirler.

Transact-SQL

dbo.MyTable'dan SEÇİN * --Os çok robiti iyi -- Değiştirme MyTable'dan SEÇİN * --Ve böylece roboti --Viklik prosedürü EXEC dbo.MyProc --Yanıt çok iyi --Yedek EXEC MyProc --Muhtemelen!

Prosedürlerinizin adlarındaki Viktorya dönemine ait olmayan “sp_” öneki kaydedilir:

Prosedürümüzün adı sp_ ile başladığından SQL Server öncelikle ana veritabanında arama yapar. Sağ tarafta bu önekin kaydedilen özel dahili sunucu prosedürleri için kullanıldığı görülmektedir. Bu nedenle seçiminiz, veritabanınızda sizinkiyle aynı isimde bir prosedür bulunacağından ek masraflara yol açabilir ve yanlış sonuca yol açabilir.

IF EXISTS (SELECT *) yerine Vickory IF EXISTS (SELECT 1):

Başka bir tablodaki kaydın varlığını kontrol etmek için IF EXISTS programını kullanıyoruz. Bu virüs true döner, virüsün içinden sadece bir değer döndürülürse “1”, tüm sütunlar veya tablo fark etmez. Şunu kabul edelim, prensip olarak başımızı belaya sokmayalım. Bu nedenle veri iletiminin yapıldığı saat boyunca trafiği sıkıştırmak için aşağıda gösterildiği gibi “1”i seçmek daha mantıklı olacaktır.

Microsoft SQL Server, uygulamak ve otomatikleştirmek için güçlü algoritmalar kullanır ( rozrakhunkiv) Kaydedilen prosedürleri takip edebilirsiniz, bu yüzden bugün size kokuların nasıl oluştuğundan, değiştirildiğinden ve ortadan kaldırıldığından bahsedeceğiz.

Hangi prosedürlerin kullanıldığını, nelerin kaydedildiğini ve T-SQL'de bunlara neden ihtiyaç duyulduğunu anlamanız için küçük bir teoriyle başlayalım.

Not! Yeni başlayan programcılara T-SQL konusuyla ilgili şu faydalı materyalleri öneriyorum:

  • T-SQL dilini ayrıntılı bir şekilde öğrenmek için, T-SQL Programcının Yolu kitabını da okumanızı tavsiye ederim. Transact-SQL'de kendi kendine öğretmen;
  • T-SQL ile profesyonel çevrimiçi kurslar

T-SQL'de hangi prosedürler saklanır?

Kaydetme prosedürleri– bunlar, bir algoritmanın bir dizi SQL talimatı olarak gömülü olduğu veritabanı nesneleridir. Yani kaydedilen prosedürlerin veri tabanının ortasında bulunan programlar olduğunu söyleyebiliriz. Kaydetme prosedürleri, sunucuya yeniden depolanan kodu kaydetmek için kullanılır; örneğin, bir algoritma, sıralı bir düzen veya uzun bir SQL ifadesi yazdınız ve böylece o algoritmaya giren tüm talimatları her zaman silmek zorunda kalmazsınız. Neleri kaydedebileceğinizi görmek için bu prosedürü tamamlayabilirsiniz. Bu durumda, bir SQL prosedürü oluşturduğunuzda sunucu kodu derler ve daha sonra bu prosedürü çalıştırdığınızda SQL sunucusu onu tekrar derlemez.

SQL Server'da saklanan bir prosedürü çalıştırmak için adından önce EXECUTE komutunu yazmak gerekir veya EXEC komutunu kısayol olarak da yazabilirsiniz. İşlev görünmediğinden, örneğin SELECT deyiminde kayıtlı yordamı çağırın. işlemler sorunsuz bir şekilde başlatılmaktadır.

Fonksiyon olarak kaydedilen prosedürlere ayrıca UNSERT, UPDATE, DELETE gibi veri değiştirme işlemlerini de ekleyebilirsiniz. Ayrıca prosedürler herhangi bir türdeki SQL ifadelerini kullanabilir; örneğin bir tablo oluşturmak için CREATE TABLE veya EXECUTE. diğer prosedürlere çağrı. Suçlama, aşağıdaki gibi bir dizi talimat türünden oluşur: işlevin oluşturulması veya değiştirilmesi, algılama, tetikleyiciler, devrelerin oluşturulması ve bir dizi başka benzer talimat, örneğin kaydetme prosedüründe de mümkün değildir Evet, bağlantıyı yeniden karıştırın veritabanına bağlam (USE).

Prosedür kaydedilebilir, giriş parametrelerini ve çıkış parametrelerini değiştirebilirsiniz, tablo verilerini döndürebilirsiniz, hiçbir şeyi döndüremezsiniz, sadece talimatları içine kaydedin.

Kaydetme prosedürleri çok ilginçtir, birçok işlemi otomatikleştirmemize ve basitleştirmemize yardımcı olur; örneğin, bir tablodan sürekli olarak çeşitli karmaşık analitik sonuçları formüle etmeniz gerekir. PİVOT operatörü. Bu operatörden sorgu oluşumunu basitleştirmek için ( Bildiğiniz gibi PIVOT esnek bir sözdizimine sahiptir), Verileri dinamik olarak biçimlendiren bir prosedür yazabilirsiniz; örneğin, "T-SQL'de Dinamik PIVOT" materyalinde, prosedür kaydedilmiş gibi göründüğü için bunun nasıl uygulanacağına dair bir örnek vardır.

Microsoft SQL Server'da depolanan prosedürleri uygulayın

Uygulamalar için verileri yazdırma

Aşağıdaki uygulamaların tümü Microsoft SQL Server 2016 Express'e yüklenecektir. Gerçek verilerle prosedürlerin nasıl çalıştığını gösterebilmek için bu verilere ihtiyacımız var, oluşturalım. Örnek olarak bir test tablosu oluşturalım ve ona birkaç kayıt ekleyelim, bunun ürünlerin fiyatlarına göre listesini içeren bir tablo olacağını varsayalım.

Tablo oluşturma talimatı CREATE TABLE TestTable( INT IDENTITY(1,1) NOT NULL, INT NOT NULL, VARCHAR(100) NOT NULL, MONEY NULL) GO -- Veri ekleme talimatı INSERT INTO TestTable(CategoryId, ProductName, Price) DEĞERLER (1 , “Misha”, 100), (1, “Klavye”, 200), (2, “Telefon”, 400) GO --Seçime kaydet SELECT * FROM TestTable


Evet, şimdi tasarruf prosedürlerinin oluşturulmasına geçelim.

T-SQL'de kayıtlı bir prosedür oluşturma – CREATE PROCEDURE talimatı

Kaydetme prosedürleri ek talimatlar izlenerek gerçekleştirilebilir. PROSEDÜR OLUŞTUR Bu talimatlardan sonra prosedürünüzün adını yazmalı ve her seferinde giriş ve çıkış parametrelerini seçmelisiniz. AS anahtar kelimesini yazdıktan sonra BEGIN anahtar kelimesiyle talimat bloğunu açarsınız ve bloğu END kelimesiyle kapatırsınız. Bu bloğun ortasına algoritmanızı uygulayacak tüm talimatları ve sonraki adımları yazarsınız, aksi takdirde T-SQL'de programlıyormuşsunuz gibi görünecektir.

Örneğin, yeni bir kayıt eklemek için kaydedilmiş bir prosedür yazalım. Test masamıza yeni ürün. Bu nedenle, üç giriş parametresi önemlidir: @CategoryId – ürün kategorisi tanımlayıcısı, @ProductName – ürün adı ve @Price – ürün fiyatı, o zaman bu parametre bizim için gereksiz olacaktır. Bu prosedüre aktarılamaz ( örneğin henüz fiyatını bilmiyoruz), bunun için kıyafetlerin anlamını atadık. O halde bunlar bu prosedürün parametreleridir. BEGIN ... END bloğunda tıpkı orijinal değişiklikler gibi vikorist yapabilirsiniz ( Bildiğiniz gibi değişiklikler @ işaretiyle belirtiliyor). Çıkış parametrelerini belirtmeniz gerekiyorsa, parametre adından sonra OUTPUT ( anahtar kelimesini girin. veya kısaltılmış OUT).

BEGIN...END bloğuna veri eklemek için bir talimat ve prosedürün sonunda bir SELECT talimatı yazacağız, böylece kaydedilen prosedür bize belirlenen ürünlerle ilgili tablo verilerini döndürecektir. yeni, iyi eklenen ürünün koşullarını içeren kategori. Aynı prosedürde, giriş parametresinin işlenmesini ve bir dizi açıklığın yanlışlıkla girilmesi durumunda durumu kapatma yöntemini kullanarak metin satırının başındaki ve sonundaki son açıklıkların seçimini ekledim.

Bu prosedürün eksen kodu ( Yogo ben de yorum yaptım).

CREATE PROSEDURE TestProcedure prosedürünü oluşturuyoruz (--Giriş parametreleri @CategoryId INT, @ProductName VARCHAR(100), @Fiyat PARA = 0) BAŞLANGIÇTA --Algoritmanın uygulanmasına yönelik talimatlar --Giriş parametrelerinin işlenmesi --Girişteki boşlukların kaldırılması metin satırının sonundaki cob i SET @ÜrünAdı = LTRIM(RTRIM(@ÜrünAdı)); --Yeni bir kayıt ekleyin INSERT INTO TestTable(CategoryId, ProductName, Price) VALUES (@CategoryId, @ProductName, @Price) --Verileri döndürün SELECT * FROM TestTable WHERE CategoryId = @CategoryId END GO


T-SQL'de saklanan bir prosedürü çalıştırma - EXECUTE komutu

Bu prosedürü, daha önce de söylediğim gibi, EXECUTE veya EXEC ek komutunu kullanarak çalıştırabilirsiniz. Giriş parametreleri, basitçe yeniden düzenlenerek ve prosedür adından sonra ilgili değerlerin eklenmesiyle prosedürlere aktarılır ( Çıkış parametreleri için OUTPUT komutunun belirtilmesi de gereklidir.). Ancak parametrelerin adları belirtilmeyebilir, aksi takdirde bu durumda değerin girilme sırasını sağlamak gerekir. değerleri giriş parametrelerinin belirtildiği sıraya göre belirtin ( Çıkış parametresi yok).

Yıkama işlemi için önemli olabilecek parametreler, isteğe bağlı parametreler olarak adlandırılan şekilde belirtilebilir veya belirtilmeyebilir.

Test prosedürümüzde korunan prosedürleri çalıştırmanın birkaç farklı ancak eşdeğer yolu vardır.

1. Fiyat belirtmeden prosedüre tıklayın. EXECUTE TestProcedure @CategoryId = 1, @ProductName = "Test ürünü 1"-2. Belirtilen fiyattan prosedüre tıklayın EXEC TestProcedure @CategoryId = 1, @ProductName = "Test ürünü 2", @Price = 300-3. EXEC TestProcedure 1, "Test ürünü 3", 400 parametrelerinin adını belirtmeden prosedüre tıklayın


T-SQL'de kayıtlı bir prosedürün değiştirilmesi – ALTER PROCEDURE talimatı

Ek talimatları kullanarak algoritmada ve prosedürde değişiklikler yapabilirsiniz. PROSEDÜRÜ DEĞİŞTİRİN. Yani aynı prosedürü değiştirmek için CREATE PROCEDURE yerine ALTER PROCEDURE yazmanız ve geri kalan her şeyi gerektiği gibi değiştirmeniz yeterlidir.

Diyelim ki test prosedürümüz öncesinde @Price parametresinde bir değişiklik yapmamız gerekiyor. hesaplamaların değerini alacağımız fiyatla yükümlüyüz ve aynı zamanda sahip olduğumuz prosedürden SELECT ifadesini alacağımız sonuç veri kümesini çıkarma ihtiyacımız olduğu da açıktır. seçilmiş sanırım.

PROSEDÜRÜ DEĞİŞTİRME TestProsedürünü değiştiriyoruz (--Giriş parametreleri @CategoryId INT, @ÜrünAdı VARCHAR(100), @Fiyat PARA) BAŞLANGIÇTA --Algoritmanızı uygulamaya yönelik talimatlar --Giriş parametrelerini işleme --Kob üzerindeki boşlukları kaldırma ve metin satırlarının sonlarında SET @ÜrünAdı = LTRIM(RTRIM(@ÜrünAdı)); --Yeni bir kayıt ekleyin INSERT INTO TestTable(CategoryId, ProductName, Price) VALUES (@CategoryId, @ProductName, @Price) END GO

T-SQL'de saklanan uzak prosedür türleri – DROP PROCEDURE ifadesi

Gerekirse kaydetmek istediğiniz prosedürü silebilir ve ek talimatlar isteyebilirsiniz. BIRAKMA PROSEDÜRÜ.

Örnek olarak oluşturduğumuz test prosedürünü görelim.

BIRAKMA PROSEDÜRÜ Test Prosedürü

Varto Pam'yatati'nin vidalenni Zberezhya prosedürlerinde bunlarla ilgili Sho Yakshcho, INSHII prosedürü Abo SQL izhstroy ile prosedürle ilgili olarak karıştırılacak, Pisli bir trompetle bitirilecek, pis koku ceketi prosedürü ve çok daha fazlası.

Her şeye sahibim, sizi temin ederim, malzeme sizin için donuk ve kahverengi olacak, hoşçakalın!

Son güncelleme: 08/14/2017

Genellikle verilerle yapılan bir işlem, belirli bir sırayla takip edilmesi gereken bir dizi talimattan oluşur. Örneğin bir ürüne satın alma işlemi eklerken sipariş tablosuna veri girmeniz gerekir. Ancak bunu yapmadan önce, satın alabileceğiniz ürünün ne olduğunu göz önünde kontrol etmeniz gerekir. Bu durumda, insanların en alt düzey zihinlerini bile yeniden doğrulamak zorunda kalmanız mümkündür. Yani aslında bir ürünü satın alma süreci, aynı sıra ile sonuçlanabilecek birçok eylemle çevrelenmiştir. Ve bu durumda, tüm bu eylemleri tek bir nesnede özetlemek daha optimaldir. kaçınılması gereken prosedür(saklı yordam).

Yani, özünde, kaydedilen prosedür bir bütün olarak takip edilen bir dizi talimattır. Kaydedilen prosedürlerin kendileri, karmaşık işlemleri basitleştirmenize ve bunları tek bir nesneye getirmenize olanak tanır. Bir ürünün satın alma sürecini değiştirmek için prosedür kodunu değiştirmek zorunludur. Bu prosedür aynı zamanda koddan daha basittir.

Kaydedilen prosedürlerin aynıları, tablolardaki verilere erişimi sınırlamanıza ve böylece bu verilere ilişkin bilinmeyen veya bilgisiz gereksiz eylemlerin görünürlüğünü değiştirmenize olanak tanır.

Bir diğer önemli husus ise üretkenliktir. Kaydetme prosedürleri daha düşük, daha düşük seviyeli SQL ifadeleriyle tamamlanmalıdır. Bütün bunlar, prosedür kodunun ilk başlatıldığında bir kez derlendiği ve ardından derlenmiş biçimde kaydedildiği anlamına gelir.

Kaydedilen bir prosedür oluşturmak için CREATE PROCEDURE veya CREATE PROC komutunu kullanın.

Dolayısıyla kaydedilen prosedürün üç temel özelliği vardır: kod basitliği, güvenlik ve üretkenlik.

Örneğin, veritabanınızın ürünlerle ilgili verileri depolayan bir tabloya sahip olduğunu varsayalım:

CREATE TABLE Ürünler (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Üretici NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

Bu tablodan veri çıkarmak için kullanılan prosedürü oluşturalım:

ürünleri KULLANINdb; GİT PROSEDÜR OLUŞTUR ÜrünÖzeti AS SEÇ ÜrünAdı AS Ürün, Üretici, Fiyat Ürünlerden

Mevcut paketi seçmek için CREATE PROCEDURE komutu gerekli olduğundan, mevcut veritabanını kuran USE komutundan sonra yeni paketi seçmek için GO komutu kullanılır.

Prosedürün adından sonra AS anahtar kelimesi bulunabilir.

Komut dosyası çözümünde prosedürün gövdesini güçlendirmek için prosedür kodu genellikle BEGIN...END bloğuna yerleştirilir:

ürünleri KULLANINdb; GİT PROSEDÜR OLUŞTUR ÜrünÖzeti BAŞLANGIÇTAN SEÇİN ÜrünAdı AS Ürün, Üretici, Fiyat Ürünlerden SON;

Prosedürü ekledikten sonra SQL Server Management Studio'dan veritabanı düğümüne alt düğümden erişebiliriz. Programlanabilirlik -> Saklı Prosedürler:

İşlemi görsel bir arayüz üzerinden de takip edebiliyoruz.

Vikonannya prosedürleri

Kaydedilen bir prosedürden çıkmak için EXEC veya EXECUTE komutunu verin:

EXEC Ürün Özeti

Görüntülenen prosedürler

Uzak bir prosedürü görüntülemek için DROP PROCEDURE komutunu kullanın:

BIRAKMA PROSEDÜRÜ ÜrünÖzeti

Kaydetme prosedürleri

Bu bölümün konusu, iş mantığını uygulamak için InterBase veritabanı uygulamaları satıcılarının kullanabileceği en güçlü araçlardan biridir. Ve görevlerin yürütülmesi için gereken kod miktarını değiştirin.Aslında karmaşık bir veritabanı eklentisi eklemek istiyorsanız, kaydedilen prosedürleri değiştirmeden yapamazsınız.
İlişkisel DBMS'lerin çoğu için gizlenen, saklanan vikoristik prosedürlerin yaygın olarak bilinen bu avantajlarına ek olarak, saklanan InterBase prosedürleri, vikorystov'a izin veren ve sonuçları orijinal SQL sorgularına dönüştüren pratik olarak değerli veri kümeleri rolünü oynayabilir.
Araştırmacılar genellikle prosedürleri kaydetmeyi, bir veritabanının ortasında çalıştırılabilen belirli bir dizi SQL sorgusu olarak düşünmeye başlarlar ve buradaki fikir, kaydedilen prosedürlerle çalışmanın çok daha karmaşık olduğudur. istemci uygulamasında yüksek seviyem
Peki InterBase'te saklanan prosedürler nelerdir?
Kaydedilen prosedür (HP), dahili InterBase uygulamasından derlenen, özel bir dille yazılan, InteiBase sunucusunun çekirdeğine bazı girişlerin derleyicisi olan bir alt program olan veritabanının meta verilerinin bir parçasıdır.
İstemci eklentilerinden, tetikleyicilerden ve kaydedilen diğer prosedürlerden bir kaydetme prosedürünü çağırabilirsiniz. Prosedür, sunucu işleminin ortasında kaydedilir ve veritabanındaki verileri işleyebilir, ayrıca hesaplamanızın sonuçlarını, onu tıklayan müşteriye (yani tetikleyici, HP, eklenti) geri gönderebilirsiniz.
HP'nin gelişmiş yeteneklerinin temeli, INSERT, UPDATE ve SELECT gibi temel SQL'in değiştirilmiş ifadelerinin yanı sıra ayrıştırma ve döngüleri (IF, WHI LE) düzenleme yöntemlerini içeren ve aynı zamanda af ve suçluları toplama yöntemlerini içeren prosedürel programlamadır. durumlarda, kaydedilen prosedürlerin dili, verilerle çalışmak için karmaşık algoritmaların uygulanmasına olanak tanır ve bunun sonucunda HP'nin ilişkisel verileriyle çalışmaya odaklanma, geleneksel dillerdeki benzer prosedürlerden önemli ölçüde daha kompakttır.
Düşük karakteristik ve sınırlara ek olarak tetikleyicilerin de aynı programlamaya tabi olduğuna dikkat edilmelidir. HP de dahil olmak üzere tetikleyicilerin sahip olduğu dilin alt kümeleri “Tetikleyiciler” (1. yıl) bölümünde tartışılmaktadır.

Kaçınılabilecek basit bir prosedür örneği

Şimdi kaydedilebilecek ilk prosedürü gerçekleştirmenin zamanı geldi ve bu sayfada kaydedilebilecek prosedürün sürecini öğrenin. Her şeyden önce, kaydedilen prosedürlerin nasıl ele alınacağı hakkında birkaç söz söyleyeyim.Sağdaki, az anlaşılan ve soyut bir araç olarak görkeminden dolayı, HP'nin son derece zayıf standart geliştirme ve tedavi yöntemlerine ihtiyaç duymasıdır. kaydedilen prosedürlerin iyiliği. InterBase belgeleri, isql yorumlayıcısına girdi olarak sağlanan HP metnini değiştirmek için ek SQL komut dosyası dosyaları için prosedürler oluşturulmasını ve bu şekilde, HP'nin bu SQL komut dosyasında derlenme aşamalarında oluşturulmasını ve değiştirilmesini gerçekleştirmenizi önerir. BLR'deki prosedür metni (BLR hakkında Bölüm "InterBase veritabanının yapısı" (bölüm 4) hakkında) aynıysa, isql, bu hatanın SQL komut dosyasının hangi satırına uygulandığına ilişkin bilgileri görüntüler. Planı ayarlayın ve her şeyi tekrar tekrarlayın. Günümüzde refahtan söz edilmiyor, ancak değişikliklerin ara değerlerine hayret etme olasılığı ile trasuvannaya vikonannya hakkında konuşuluyor. Açıkçası, böyle bir yaklaşım, uygulayıcının gözünde kalan prosedürlerin artan popülaritesine uyum sağlamamaktadır.
Ancak HP'nin geliştirilmesinde standart minimalist yaklaşıma ek olarak<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
Kaydedilen prosedürlerin sözdizimi aşağıdaki sırayla açıklanmaktadır:

PROSEDÜR OLUŞTUR adı
[(param veri türü [, parametre veri türü...])]
)]
GİBİ
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
DECLARE VARIABLE var veri türü;

=
BAŞLAMAK
< compound_statement>
[< compound_statement> ...]
SON
< compound_statement> = (ifade;)

Çok gibi görünüyor ve hantal olabilir, ancak gerçekte her şey çok basit.Sözdizimine yavaş yavaş hakim olmak için, giderek karmaşık hale gelecek örneklere bakalım.
İşte girdi olarak iki sayıyı alan, bunları toplayan ve ortaya çıkan sonucu döndüren basit bir prosedür:

PROSEDÜR OLUŞTUR SP_Add(first_arg ÇİFT HASSASİYET,
Second_arg ÇİFT HASSASİYET)
İADE (Sonuç ÇİFT HASSASİYET)
GİBİ
BAŞLAMAK
Sonuç=ilk_arg+ikinci_arg;
ASKIYA ALMAK;
SON

Gördüğünüz gibi, her şey basit: CREATE PROCEDURE komutundan sonra, yeni oluşturulan prosedürün adı (veritabanında benzersiz olabilir) belirtilir - SP_Add'de, ardından HP'nin giriş parametrelerinin ayarlandığı kişi - First_arg ve Second_arg - türlerinin anlamlarıdır.
Giriş parametrelerinin listesi, CREATE PROCEDURE operatörünün isteğe bağlı bir parçasıdır - prosedür tarafından, prosedür gövdesinin ortasındaki tabloya ek sorgular kullanılarak çalışması için tüm veriler alındığında, ayrılmalar meydana gelir.

Kaydedilen prosedürlerde, InteiBase'de saklanan veri türleri, veri türü - etki alanları tarafından belirlenen diziler ve türler listesine aktarılmaz.

Daha sonra RETURNS anahtar kelimesi gelir, ardından kollardaki parametreler belirlenen türlerine dönecek şekilde değiştirilir - bu kategoride yalnızca bir tane vardır - Sonuç.
Prosedürün parametreleri döndürmesi gerekmediğinden, GERİ DÖNÜŞ kelimesi ve döndürülen parametrelerin listesi günlüktür.
AS anahtar sözcüğü RETURNSQ'dan sonra belirtilir. AS anahtar kelimesine git başlık, ve yeniden sonra - tekno prosedürler.
Kaydedilen prosedürün gövdesi, bir nokta (;) ile ayrılmış dahili (yerel) değişikliklerin (aşağıda tartışılan kötü koku gibi) ve bir operatör bloğunun, operatördeki yerleşimlerin açıklamalarının bir aktarımıdır. ve kollar BAŞLANGIÇ SON. Bu durumda, HP'nin gövdesi daha da basittir; yalnızca iki giriş argümanı ekleriz ve bunların sonuçlarını çıktıya atarız ve ardından SUSPEND komutunu çağırırız. Birazdan bu komutun özünü anlayacağız, ancak şimdilik önemli olan, kaydedilecek prosedüre tıkladıktan sonra oraya gidecek olan parametreleri aktarmanın gerekli olmasıdır.

Kaçınılması gereken prosedürlerde tek kullanımlık malzemeler

Prosedürün ortasındaki ifadenin kısa çizgi (;) ile biteceğini lütfen unutmayın. Görünüşe göre nokta standart bir SQL komut ayırıcısıdır; SQL yorumlayıcısına giriş komutu metninin girildiğini bildirir ve işleme başlamasını gerektirir. HP'nin ortasında bir nokta tespit eden SQL yorumlayıcısının, komutun girildiğini anladığını ve prosedürün kaydedilen kısmından çıkmaya çalıştığını neden görmüyorsunuz? Bu teslimiyetin hiçbir anlamı yok. Arama sonuçlarınızı kaydedeceğiniz bir dosya oluşturmak, veritabanına bağlanmak için bir komut eklemek ve ek bir isql yorumlayıcısı kullanarak SQL betiğini çalıştırmayı denemek kolaydır; bu durumda tutarsızlık nedeniyle hata tersine dönecektir ve düşünce Yorumlanacak ator, kaçınılabilecek takım oluşturma prosedürlerini tamamlamış olacaktır. InterBase paketindeki özel araçları kullanmadan ek SQL komut dosyası dosyaları için kaydetme prosedürleri oluşturmak istiyorsanız, HP oluşturmak için her komuttan önce komut dosyası komut ayırıcısını (tetikleyiciler için 1 ile aynı) ve ardından başka bir sembolle (tetikleyiciler) değiştirmeniz gerekir. ardından nokta ve HP hayran yogo metninden sonra. Bölümleyiciyi bir SQL teklifiyle değiştiren isql komutu şuna benzer:

DÖNEMİ AYARLA

Tipik bir durumda kaydedilen prosedür şuna benzer:

DÖNEMİ AYARLA^;
PROSEDÜR OLUŞTUR some_procedure
... . .
SON
^
SÜRESİ AYARLAYIN;^

Viklik kaydedilmiş prosedür

Nelerin kurtarılabileceğine ilişkin prosedürümüze dönelim. Artık, oluşturulduktan sonra tıklamanız, parametrelerini iletmeniz ve döndürülen sonuçları almanız gerekir. Bunu yapmak gerçekten çok kolay; tek yapmanız gereken, kolay görüntüleme için SQL komutunu yazmak:

SEÇME *
Sp_add'DAN (181.35, 23.09)

Bu bizi bir satırla dolduracak, böylece 181,35 ve 23,09 sayılarının toplamının, ardından 204,44'ün olacağı tek bir Sonuç alanı olacak.
Böylece prosedürümüz, istemci programlarında kullanılabilen temel SQL sorgularının yanı sıra diğer HP veya tetikleyicilerde de kullanılabilir. Prosedürümüzdeki bu değişiklik, kaydedilen prosedürün sonuna SUSPEND komutunun eklenmesiyle mümkün olmuştur.
Sağda, InterBase'de (ve tüm klonlarında) kaydedilen iki tür prosedür vardır: seçilebilir prosedürler ve yürütülebilir prosedürler. Bu iki HP tipinin önemi, seçim prosedürlerinin öncelikle veri setinde göründükleri gibi sıra halinde gruplandırılmış çıktı parametreleri setlerini döndürmesi ve birleştirilmiş prosedürlerin parametreleri döndürebilmesi veya döndürmeyebilmesi veya yalnızca döndürebilmesi gerçeğinde yatmaktadır. geçersiz kılınan bir dizi çıktı parametresi İadeler, bir parametre satırına sahiptir. Seçici prosedürler SELECT komutu kullanılarak seçilir ve seçilecek prosedürler EXECUTE PROCEDURE komutu kullanılarak seçilir.
Ancak kaydedilen iki prosedür türü yeni bir sözdizimine sahiptir ve resmi olarak herhangi bir farklılık göstermez, dolayısıyla herhangi bir prosedür bir SELECT deyiminde çağrılabilir veya bir seçim prosedürü EXECUTE PROCEDURE kullanılarak çağrılabilir. Beslenme, farklı hastalık türlerinde HP ile nasıl başa çıkılacağıdır. Yani ses tipine göre tasarlanan prosedürde farklılık vardır. Bu seçim prosedürü, SELECT komutundan yapılan çağrı için özel olarak oluşturulmuştur ve eklenen prosedür, EXECUTE PROCEDURE isteminden yapılan çağrı için özel olarak oluşturulmuştur. Bu iki HP türünün tasarımındaki farkların neler olduğuna bir göz atalım.
Örnekleme prosedürünün nasıl çalıştığını anlamak için teoriye biraz dalmamız gerekiyor. SELECT ID, NAME FROM Table_example gibi net bir SQL sorgusu kullanalım. Bu seçim sonucunda çıktı olarak iki sütun (ID ve NAME) ve birkaç satırdan (Tablo_örnek tablosundaki aynı sayıda satır) oluşan bir tablo üretiyoruz. Bu sorgu sonucunda tabloya SQL veri seti de denilmektedir. . Daha sonra sunucu dış görünüm kaydını okur, sorgu sonuçlarını karşılar, gerekli alanlardan (ID ve İSİM gibi) seçim yapar ve bunları istemciye gönderir. Daha sonra işlem, seçilen cilt kaydı için tekrar tekrarlanır.
Yetkili okuyucunun, kaydedilen prosedürler de dahil olmak üzere tüm SQL veri setlerinin arka arkaya oluşturulduğunu anlaması için tüm bu erişim gereklidir! Ve temel fark, prosedürlerin çeşitliliği-prosedürlerin seçimidir; bu, ilkinin sıra sıralarını döndürmek için tasarlandığı ve diğerlerinin yalnızca bir tanesi için olduğu gerçeğine indirgenir. Bu nedenle farklı şekillerde karmaşıklaşır: Seçim prosedürü, döndürülebilecek tüm kayıtları seçme prosedürünü "ima eden" SELECT komutundan sonra çağrılır. Sonuçta ortaya çıkan prosedür, HP'den yalnızca bir satırı "alan" ve onu yok sayan (kokuşmuş!) ek YÜRÜTME PROSEDÜRÜ'nü gerektirir.
Daha açık hale getirmek için seçim prosedürü örneğine bir göz atalım. Bağışlamanız için, SELECT ID, NAME FROM Table_Example'ı girerken tam olarak aynı şekilde çalışan prosedürü kaydettik, böylece tüm tablodan ID ve NAME alanlarını seçebiliyorsunuz. Aks ucu:

PROSEDÜR OLUŞTUR Simple_Select_SP
İADELER (
procID TAM SAYI,
procNAME VARCHAR(80))
GİBİ
BAŞLAMAK
İÇİN
tablo_örneğinden ID, İSİM SEÇİN
INTO:procID, :procNAME
YAPMAK
BAŞLAMAK
ASKIYA ALMAK;
SON
SON

Simple_Select_SP adı verilen bu prosedürlere bakalım. Gördüğünüz gibi giriş parametresi yok ve iki çıkış parametresi var - ID ve NAME. En önemlisi, prosedür boyunca ortaya konmuştur. FOR SELECT yapısının bir revizyonu aşağıda verilmiştir:

İÇİN
tablo_örneğinden ID, İSİM SEÇİN
INTO:procID, :procNAME
YAPMAK
BAŞLAMAK

/*procID ve procName nasıl değiştirilir*/

SON

Bu kod satırı şu anlama gelir: Table_example tablosundan seçilen dış görünüm satırı için, procID ve procName değişikliklerinin seçilen değerlerini yerleştirin ve ardından bu değişikliklerle ilgili tüm eylemleri gerçekleştirin.
Olumlu suçlamalarda bulunup şunu sorabilirsiniz: "Değişiklikler? Hala nasıl değişiyorlar 9" Bu da bu bölümün sürprizine benziyor - prosedürlerde kaydedilenleri, değişiklikleri vikorize edebiliyoruz. Mov HP'de prosedürün ortasında geçerli yerel değişiklikleri seçebilir ve giriş ve çıkış parametrelerini değiştirilebilir olarak seçebilirsiniz.
Kaydedilen bir prosedürde yerel bir değişikliği duyurmak için, açıklamasını AS anahtar sözcüğünden sonra ve ilk BEGIN sözcüğünden önce yerleştirmelisiniz.Yerel değişiklik açıklaması şu şekilde görünür:

DEĞİŞKENİ BİLDİR ;

Örneğin, yerel Mylnt değişikliğinin tamamını oylamak için AS ve BEGIN arasına bir sıfat açıklaması eklemeniz gerekir.

DEĞİŞKEN Mylnt TAM SAYISININ BİLDİRİLMESİ;

Uygulamamızdaki değişiklikler çiftlerle başlar. Bunun nedeni FOR SELECT SQL komutunun ortasında yer almalarıdır, dolayısıyla SELECT'te seçilen tablolardaki alanları ayırmak için değiştirilebilir olanların kalan çift kutulara aktarılması gerekir. Bu değişiklikler bile tablolardaki alanlarla aynı şekilde çağrılabilir!
Eğer değişiklikten önce double not varsa bunu sadece SQL sorgularının ortasında kullanmak gerekir. Canavarın metinleriyle poz, çift kenar olmadan titremelidir, örneğin:

procName = "Bazı adlar";

Prosedürümüzün ana kısmına dönelim. FOR SELECT yan tümcesi, verileri bir tablo görünümünde (her seferinde bir satır olmak üzere bir veri kümesi) döndürür. Dönen dış görünüm alanı kendi adına yerleştirilebilir: ID => procID, NAME => procName. DO bölümünde bu değişiklikler istemciye SUSPEND komutu kullanılarak prosedür çağrılarak istenir.
Böylece FOR SELECT... DO komutu, komutun SELECT bölümünde seçilen kayıtların bir döngüsünü düzenler. DO kısmı tarafından başlatılan bu döngüde, son oluşturulan kaydın istemciye aktarımı ek SUSPEND komutu kullanılarak tamamlanır.
Ayrıca, titreşim prosedürü, HP gövdesinin ortasında, sonuçta değişen parametreleri saklayan bir döngünün düzenlendiği bir veya daha fazla sıranın döndürülmesi için tasarlanmıştır. Ve bu döngünün sonunda, bir sonraki veri satırı istemciye döndürüldüğü için SUSPEND komutu gereklidir.

Döngüler ve operatörler

Herhangi bir seçimin kayıtlarından bir döngü düzenleyen FOR SELECT...DO komutuna ek olarak, başka bir döngü türü daha vardır - WHILE...DO, bu da seçimin yeniden incelenmesine dayalı bir döngü düzenlemenizi sağlar. herhangi bir akıl. Eksen, WHILE vikorist döngüsü olan HP'nin poposudur. YAPMAK. Bu prosedür, tamsayıların karelerini 0'dan 99'a döndürür:

PROSEDJRE DÖRTLÜ OLUŞTURUN
İADELER (DÖRTLÜ TAM SAYI)
GİBİ
DEĞİŞKEN I TAM SAYISI BİLDİRİN;
BAŞLAMAK
ben = 1;
WHILE(i<100) DO
BAŞLAMAK
DÖRDÜNCÜ = I * I;
ben=I+1;
ASKIYA ALMAK;
SON
SON

Sonuç olarak, SELECT FROM QUAD'a gireceğiz ve 1'den 99'a kadar tam sayıların karelerine sahip olacak bir QUADRAT sütunu içeren bir tablo oluşturacağız.
Kaydedilen prosedürlerde, bir SQL sorgusunun ve klasik döngünün sonuçları üzerinde yinelemeye ek olarak, düzenlemeyi vykonanny sırasına göre düzenlemenize olanak tanıyan IF...THEN..ELSE operatörü kullanılır. sözdizimi movs'taki silahsızlanma operatörlerinin çoğuna benzeyen, Pascal ve Si komut dosyasına dayanan yüksek seviyeli programlama.
Saldırıyı durdurmak için kaçınılması gereken prosedürün karmaşık kısmına bir göz atalım.

  1. Table_example tablosundaki ortalama fiyatı hesaplar (böl. "Birincil anahtar tablolar ve oluşturucular" bölümü)
  2. Daha sonra, tablodaki her giriş için, orijinal fiyatın (FİYAT) ortalama fiyattan büyük olup olmadığını kontrol etmek, ardından fiyatı ortalama fiyatın değerine eşitlemek ve ayrıca yüzlerce sabitlemeyi belirtmek gerekir.
  3. Orijinal fiyatın ortalama fiyattan düşük veya yüksek olması durumunda fiyat, orijinal fiyat artı ortalama fiyat ile ortalama fiyat arasındaki farkın yarısına eşit olarak belirlenir.
  4. Tablodaki değiştirilen tüm satırları döndürür.

Çoğunlukla HP'nin adı ve giriş ve çıkış parametreleri önemlidir.Her şey, kaydedilen prosedürün başlığında yazılıdır.

PROSEDÜR OLUŞTURFiyatları Arttırın (
Yüzde2lartış ÇİFT HASSASİYET)
DÖNÜŞLER (ID INTEGER, NAME VARCHAR(SO), new_price DOUBLE
HASSASİYET OLARAK

Prosedürün adı ArtışFiyatları olacaktır, ÇİFT HASSASİYET türünde Peiceni21nciease giriş parametresine ve 3 çıkış parametresine sahiptir - ID, NAME ve new_pnce. İlk iki çıktı parametresinin, çalışmayı seçtiğimiz Table_example tablosundaki alanlarla aynı adlara sahip olduğunu unutmayın. Buna uluslararası prosedür kuralları izin vermektedir ve korunması gerekmektedir.
Ortalama değeri koruyarak galip geleceğimize göre, yerel bir değişimin sesini duyurmak artık bizim sorumluluğumuzdur.

DEĞİŞKENİ BİLDİRİN avg_price ÇİFT HASSASİYET;

Şimdi HP'nin gövdesinde korunan prosedürün ana kısmına geçelim anahtar kelime BEGIN.
Şu anda ortalama fiyatı hesaplamak için algoritmamızın ilk adımını tamamlamamız gerekiyor. Kimler için hızlıca şöyle bir şey soruyoruz:

AVG'Yİ SEÇİN(Fiyat_l)
FROM Tablo_Örnek
İÇİNE:avg_price,-

Bu, PRICE_1 alanının ortalama değerini seçilen satırlar arasında döndürmek için AVG toplama işlevini kullanır - bizim durumumuzda, Table_example tablosunun tamamı için PRICE_1'in ortalama değeri. Döndürülen değer avg_price değişikliğine yerleştirilir. Yıkamada vikorize edilen alanlardan ayırmak için avg_pnce değişikliğinin önünde çift onay kutusu bulunduğunu lütfen unutmayın.
Bu sorgunun özelliği, her seferinde kesinlikle bir kaydı döndürmesidir. Bu tür sorgulara tekli sorgular denir ve kaydedilen prosedürlerde yalnızca bu tür seçimler değiştirilebilir. Birden fazla satır dönüyorsa, bunu, dönen cilt sırasının işlenmesi için bir döngü düzenleyen FOR SELECT...DO tasarımıyla tasarlamak gerekir.
Yani fiyatın ortalama değerine ulaştık. Artık tablonun tamamını gözden geçirmeniz, her girişteki fiyat değerlerini ortalama fiyatla eşitlemeniz ve benzer işlemleri yapmanız gerekiyor.
Başlangıçta Table_example tablosundan cilt kaydının bir aramasını düzenliyoruz

İÇİN
ID, NAME, PRICE_1 SEÇİN
FROM Tablo_Örnek
İÇİNE:ID, :NAME, :new_price
YAPMAK
BAŞLAMAK
/*_burada cildi tahriş ediyoruz*/
SON

Bu yapıyı Table_example tablosundan eklediğinizde her satıra ait veri ve alan değerlerine değiştirilebilir bir ID, NAME ve new_pnce verilecektir. Değişikliklerin çıktı parametreleri olarak yapıldığını ancak sonuç olarak veri toplamaya tabi olduğunu elbette hatırlıyorsunuz, ancak bu doğru değil: çıktı parametrelerinin atanmamış olması, arayan HP istemcisi hakkında anlamına gelmez. , bu önemi ortadan kaldırıyor! Parametrelerin iletilmesi yalnızca SUSPEND komutu seçildiğinde çalışır ve o zamana kadar çıktı parametrelerini birincil değişiklikler olarak seçebiliriz - uygulamada aynısını new_price parametresiyle yaparız.
Daha sonra gövdenin ortasında deri sırasının anlamı ile BAŞLA... SON döngüsünü tamamlayabiliriz. Hatırlayacağınız gibi baz fiyatın ortalamadan nasıl çıktığını anlamamız ve benzer işlemleri yapmamız gerekiyor. Bu hizalama prosedürü ek IF operatörü kullanılarak uygulanır:

IF (new_price > avg_price) THEN /*orijinal fiyat ortalama fiyattan yüksektir*/
BAŞLAMAK
/*daha sonra ortalama fiyat artı sabit fiyatlara eşit olan yeni bir fiyat belirliyoruz */
yeni_fiyat = (ortalama_fiyat + avg_fiyat*(Yüzde2Artış/100));
GÜNCELLEME Tablo_örneği
PRICE_1 AYARI = :yeni_fiyat
NEREDE KİMLİK =: Kimlik;
SON
BAŞKA
BAŞLAMAK
/* Orijinal fiyat ortalama fiyattan küçük veya ona eşitse, fiyat en yüksek fiyat artı en yüksek ve ortalama fiyat arasındaki farkın yarısına eşit olarak belirlenir */
yeni_fiyat = (yeni_pnce + ((avg_pnce yeni_fiyat)/2)) ;
GÜNCELLEME Tablo_örneği
PRICE_1 AYARI = :yeni_fiyat
NEREDE ID = .ID;
SON

Gördüğünüz gibi, IF'nin harika bir yapısı gün ışığına çıktı, bunu dikkate almak önemlidir, böylece /**/ simgelerine uyan hiçbir yorum kalmaz.
Fiyatı hesaplanan maliyete kadar değiştirmek için, diğer kayıtları (bir veya daha fazla) değiştirmenize olanak tanıyan UPDATE operatörünü kullanırız. Fiyatın hangi kayıtta değiştirilmesi gerektiğini açıkça belirtmek için, WHERE alanına, akış kaydının kimlik değerinin saklandığı, değiştirilebilir olana eşit bir birincil anahtar alanı ekliyoruz: ID=:ID. Değiştirilen kimliğin önünde çift kutu bulunduğunu lütfen unutmayın.
Yeni IF...THEN...ELSE yapısından sonra değişen ID, NAME ve new_price, prosedüre tıklayan client'ı dönüştürmekten sorumlu olduğumuz verileri içerir. Bunu yapmak için IF'den sonra SUSPEND komutunu eklemek gerekir, çünkü veriler oraya aktarıldığı için HP adı verilen sinyaller. SELECT...DO sorgunuzdaki tüm kayıtları incelemez.
Kaydedilen prosedürü sonlandıran SUSPEND komutunun yanında, satır aktarıldıktan sonra kaydedilen prosedürü sonlandıran EXIT komutunun geldiğini lütfen unutmayın. Bununla birlikte, EXIT komutunu kullanmak nadiren gerekli olur, herhangi bir zihne ulaşıldığında döngüyü kesintiye uğratmak için parçalara ihtiyaç duyulur.
Bu durumda prosedür SELECT ifadesi ile çağrılmış ve EXIT ile tamamlanmışsa kalan çizilen satır döndürülmeyecektir. Prosedürü yarıda kesmeniz ve yine de bu satırı iptal etmeniz gerekiyorsa, sırayı hızlı bir şekilde tamamlamanız gerekir.

ASKIYA ALMAK;
ÇIKIŞ;

EXIT'in temel amacı, EXECUTE PROCEDURE aracılığıyla parametreler aracılığıyla döndürülebilen tekil veri kümelerini almaktır. Bu tipte çıkış parametrelerinin değerleri ayarlanır, aksi takdirde SQL veri seti oluşturulmaz ve son prosedür sona erer.
Mantığını bir bakışta anlayabilmemiz için, baştan sona kayıtlı olan prosedürümüzün metnini yazalım:

PROSEDÜR OLUŞTURFiyatları Arttırın (
Percent2Artış ÇİFT HASSASİYET)
DÖNÜŞLER (ID TAM SAYI, İSİM VARCHAR(80),
new_price ÇİFT HASSASİYET) OLARAK
DEĞİŞKENİ BİLDİRİN avg_price ÇİFT HASSASİYET;
BAŞLAMAK
AVG'Yİ SEÇİN(Fiyat_l)
FROM Tablo_Örnek
İÇİNE: avg_price;
İÇİN
ID, NAME, PRICE_1 SEÇİN
FROM Tablo_Örnek
İÇİNE:ID, :NAME, :new_price
YAPMAK
BAŞLAMAK
/*işte cilt kaydı*/
IF (new_pnce > avg_price) THEN /*orijinal fiyat ortalama fiyattan yüksektir*/
BAŞLAMAK
/*ortalama fiyat artı sabit fiyatlarla aynı olan yeni bir fiyat belirleyin */
yeni_fiyat = (ortalama_fiyat + avg_fiyat*(Yüzde2lartış/100));
GÜNCELLEME Tablo_örneği
PRICE_1 AYARI = :yeni_fiyat
NEREDE KİMLİK =: Kimlik;
SON
BAŞKA
BAŞLAMAK
/* Taban fiyat ortalama fiyattan küçük veya ona eşitse, fiyat, fiyat ile ortalama fiyat arasındaki farkın yarısının toplamına eşit olarak belirlenir */
yeni_fiyat = (yeni_fiyat + ((ortalama_fiyat - yeni_fiyat)/2));
GÜNCELLEME Tablo_örneği
PRICE_1 AYARI = :yeni_fiyat
NEREDE KİMLİK =: Kimlik;
SON
ASKIYA ALMAK;
SON
SON

Kaydedilen bir prosedüre ilişkin bu örnek, kaydetme prosedürlerimizin ve tetikleyicilerimizin temel tasarımını göstermektedir. Daha sonra, sıklıkla başarısız olan belirli görevleri tamamlamak için kaydedilen prosedürleri oluşturma yöntemlerine bakacağız.

Kaydedilen özyinelemeli prosedürler

InterBase kayıtlı prosedürler yinelenebilir. Bu, kendinize kaydedilen prosedürleri arayabileceğiniz anlamına gelir. 1000'e kadar prosedür girişine izin verilir ve bu girişler, HP'nin maksimum kapasitesine ulaşılmadan önce sunucudaki mevcut kaynakların tükenebileceğinin hatırlanması ihtiyacı nedeniyle kaydedilir.
Kaydedilen en yaygın prosedürlerden biri, veritabanına kaydedilen ağaç benzeri yapıların işlenmesidir. Ağaçlar genellikle depolardan, ambarlardan, personelden ve diğer genişletilmiş takviyelerden hasat edilir.
Aynı yatırım düzeyinden başlayarak aynı türdeki tüm ürünleri seçerken izlenen prosedüre bir göz atalım.
Hemen bir görev belirleyelim: Bu türden hiyerarşik yapıya sahip ürünleri duyurabiliriz:

Ürünler
- Pobutova tekniği
- Buzdolapları
- Üç odacıklar
- İki odacıklı
- Tek odacıklı
- Pralin makineleri
- dikey
- önden
- Klasik
-Vuzki
- Bilgisayar Teknolojisi
....

Ürün kategorisi göstergesinin bu yapısı farklı derinliklerde olabilir. aynı zamanda zaman içinde büyüme. Görevimiz, herhangi bir düğümden başlayarak hoparlörden tüm terminal elemanlarının "yeni bir ismin brütünden" seçilmesini sağlamaktır. Örneğin, “Pralnye makineleri” üniversitesini seçersek aşağıdaki kategorileri seçmemiz gerekir:

Çamaşır makineleri - Dikey
Ön makineler - Ön Klasik
Ön makineler - Ön tekerlekler

Tablonun yapısı ürün yöneticisine ilişkin bilgilerin kaydedilmesi açısından önemlidir. Vikorist'in bir ağacı tek bir tabloda düzenlemek için basitleştirilmiş bir şeması vardır:

TABLO OLUŞTUR
(ID_GOOD TAM SAYI BOŞ DEĞİL,
ID_PARENT_GOOD TAM SAYI,
GOOD_NAME VARCHAR(80),
kısıtlama pkGooci birincil anahtarı (ID_GOOD));

İçinde 3 alanın bulunduğu bir GoodsTree tablosu oluşturuyoruz: ID_GOOD - makul kategori tanımlayıcısı, ID_PARENT_GOOD - bu kategori için şirketin tanımlayıcısı ve GOOD_NAME - kategorinin adı. Bu tablodaki verilerin bütünlüğünü sağlamak için bu tabloya yabancı anahtar uyguluyoruz:

ALTER TABLE ÜrünlerAğaç
SINIRLAMA EKLE FK_goodstree
YABANCI ANAHTAR (ID_PARENT_GOOD)
REFERANSLAR GOODSTPEE (ID__GOOD)

Tablo kendi kendine zorlanır ve bu harici anahtar onu takip eder. Memnun olmayan babalarınıza masanın gönderilmesi için daha sonra pedlerin bulunduğu ürün kategorilerini seçmeye çalışacaksınız.
Aşağıdaki verileri tablomuza ekleyelim:

ID_GOOD

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

ID_PARENT_GOOD

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

İYİ İSİM

MAL
Pobutova teknolojisi
Bilgisayarlar ve aksesuarlar
buzdolapları
Pralin makineleri
Üç odacıklı
İki odacıklı
Tek odacıklı
Dikey
Önden
Vuzki
Klasik

Şimdi, verileri kaydedecek bir yerimiz varsa, kaydedilen prosedürü tamamlamaya devam edebiliriz; bu, tüm "kalan" ürün kategorilerinin "açık" görünümde görüntülenmesiyle sonuçlanacaktır - örneğin "Üç oda" için Kategorilerin dışındaki kategori "Pobutova ekipmanı" Üç odacıklı " buzdolapları gibi görünecektir.
Ağaç benzeri yapıları koruyan ve şekillendiren prosedürler kendi terminolojisini geliştirmiştir. Bir ağacın kabuk unsuruna vuzlom denir; ve düğümler arasında bire bir zorlanan drenajlara baba-boyun drenajları denir. Ağacın en ucunda bulunan ve kanatlara değmeyen tüylere yaprak denir.
Kaydedilen prosedürümüz için giriş parametresi kategori tanımlayıcısı olacağından işleme başlayacağız. Prosedür şu şekilde korunmuştur:

GETFULLNAME PROSEDÜRÜ OLUŞTURUN (ID_GOOD2SHOW INTEGER)
İADE (FULL_GOODS_NAME VARCHAR(1000),
ID_CHILD_GOOD INTEGER)
GİBİ
DEĞİŞKEN CURR_CHILD_NAME VARCHAR(80);
BAŞLAMAK
/*ID_GOOD=ID_GOOD2SHOW ile ürünün orta alanlarının arkasında SEÇİM İÇİN bir dış döngü düzenliyoruz */
SEÇMEK İÇİN gtl.id_good, gtl.good_name
GoodsTree gtl'den
NEREDE gtl.id_parent_good=:ID_good2show
INTO:ID_CHILD_GOOD, :ful_goods_name
YAPMAK
BAŞLAMAK
/"Eğer kemerlerde en az bir satır dönmüşse TRUE'ya dönüşen EXISTS ek fonksiyonunu kontrol edin. Bulunan ID_PARENT_GOOD = ID_CHILD_GOOD düğümünde herhangi bir ped yoksa, o zaman bu ağacın bir "yaprağıdır" ve içinde kaybolur. Sonuçlar * /
EĞER (MEVCUT DEĞİLSE(
GoodsTree'DEN * SEÇİN
NEREDE GoodsTree.id_parent_good=:id_child_good))
DAHA SONRA
BAŞLAMAK
/* Ağacın "arkush"unun sonuçlara aktarılması */
ASKIYA ALMAK;
SON
BAŞKA
/* Pedleri hareket ettiren düğümler için*/
BAŞLAMAK
/*düğüm babasının adını zamanında değişiklikten kurtarmak*/
CURR_CHILD_NAME=full_goods_name;
/* bu prosedürü yinelemeli olarak başlat */
İÇİN
ID_CHILD_GOOD, tam_ürün_adı SEÇİN
GETFULLNAME'DEN (:ID_CHILD_GOOD)
INTO:ID_CHILD_GOOD, :ful_goods_name
BAŞLAYIN
/*bulunan düğüme baba düğümün adını ekle., ek satır birleştirme işleminden sonraki düğümün adı || */
full_goods_name=CURR_CHILD_NAME| " " | tam_mal_adı,-
ASKIYA ALMAK; /* ürün adının dışına döndürüldü*/
SON
SON
SON
SON

Bu prosedürü ID_GOOD2SHOW=1 giriş parametresi ile tanımlarsak, aşağıdaki çıktıyı alabiliriz:

Bildiğiniz gibi, kaydedilen özyinelemeli prosedürü kullanarak, tüm kategori ağacını inceledik ve iğnelerin uçlarında bulunan "yapraklar" kategorilerinin adlarını ortaya çıkardık.

Visnovok

Kaçınılabilecek prosedürlerin temel özelliklerine göz atarak burada bitiriyoruz. Açıkçası prosedürleri tam olarak anlayabilmek için tek bir bölüm okuyarak tasarruf yapmak mümkün değil ancak burada tasarruf prosedürleriyle ilgili ana kavramları tespit etmeye ve açıklamaya çalıştık. HP'nin tasarım ve tasarım yöntemlerine ilişkin açıklamalar çoğu veritabanında bulunabilir.
Kaydedilen prosedürlerin geliştirilmesiyle ilgili önemli besinlerden bazıları, suçluların toplanmasına ve kaydedilen prosedürlerdeki en uygun durumlara adanmış olan "InterBase prosedürlerini kaydetme gücünün genişletilmesi" başlıklı gelecek bölümde açıklanacaktır. ve dizilerle çalışın.

Microsoft, kaydedilen genişletilmiş prosedürleri programlamak için ODS (Açık Veri Hizmeti) API'sine, MS SQL Server 2000'in genişletilmiş işlevselliğine izin vermek amacıyla sunucu tarafı uzantılarını teşvik etmek için kullanılan bir dizi makro ve işlev sağlar.

Kaydedilen genişletilmiş prosedürler - bunlar, ODS API'sinden ve WIN32 API'sinden C/C++ ile yazılmış, dinamik bağlantı kitaplığı (dll) biçiminde tasarlanmış ve daha önce de söylediğim gibi, işlev işlevselliğini genişletmek için çağrılar yapan birincil işlevlerdir. SQL Server. ODS API, geliştiriciye, birincil kayıt kümeleri olarak tüm harici veri kaynaklarını (veri kaynakları) hariç tutarak, istemciye veri aktarımına izin veren zengin bir işlevler kümesi sağlar. Ayrıca genişletilmiş saklı yordam, OUTPUT parametresini geçirerek değerleri döndürebilir.

Korunan gelişmiş prosedürlerin nasıl gerçekleştirileceği.

  • Bir istemci programı genişletilmiş bir prosedürü çağırdığında veriler kaydedilir ve Net-Libraries ve Açık Veri Hizmeti aracılığıyla TDS formatında MS SQL SERVER çekirdeğine aktarılır.
  • SQL Server, genişletilmiş kaydetme prosedürü ile ilişkili dll kütüphanesini tanır ve daha önce buraya aktarılmadığı için onu bağlamına yerleştirir ve bir fonksiyon olarak uygulanan genişletilmiş kaydetme prosedürünü çağırır.Ortada bir dll var.
  • Prosedür, gerekli eylemlerin sunucuya kaydedilmesi, kaydedilmesi ve kaydedilmesi ve sonuç kümesinin ODS API tarafından sağlanan vikoryst hizmeti olan istemci uygulamasına aktarılması için genişletildi.

Korunan genişletilmiş prosedürlerin özellikleri.

  • Kaydedilen genişletilmiş prosedürler - bu işlevler, MS SQL Server'ın adres alanına ve MS SQL Server hizmetinin altında çalıştığı bulut kaydının güvenliği bağlamına entegre edilmiştir;
  • Kaydedilen genişletilmiş prosedürlere sahip dll kitaplığı bellekte saklandıktan sonra, SQL Server kesintiye uğrayana veya yönetici aşağıdaki komutu kullanabilene kadar orada kaybolur:
    DBCC DLL_adı (ÜCRETSİZ).
  • Kaydedilen prosedür genişletildi ve bilgisayarda kaydedilen orijinal prosedürle aynı şekilde başlatıldı:
    xp_extishedProcName @param1, @param2 ÇIKIŞINI ÇALIŞTIRIN
    @param1 giriş parametresi
    @param2 giriş/çıkış parametresi
Saygı!
Robotlarının çalıştırdığı kritik programlar olsun, MS SQL Server hizmet sürecinin adres alanına kaydedilen ve saklanan genişletilmiş prosedürlerin kalıntıları, sunucu çekirdeğinin yanlış gitmesine neden olabilir; yüklemeden önce DLL'nizi şiddetle protesto etmeniz önerilir. çalışan sunucuya.

Korunan genişletilmiş prosedürlerin oluşturulması.

Bu işlevi mevcut prototipte korumak için prosedür genişletildi:

SRVRETCODE xp_extishedProcName(SRVPROC * pSrvProc);

Parametre pSrvProc Belirli bir istemci bağlantısına yönelik tanıtıcı olan SRVPROC yapısındaki bir gösterge. Bu yapının alanları belgelenmemiştir ve ODS kitaplığının Open Data Services sunucu uygulaması ile istemci arasındaki iletişimi ve verileri yönetmek için kullandığı bilgileri içerir. Her durumda bu yapıya geri dönmenize gerek yoktur ve artık onu değiştiremezsiniz. ODS API'nin herhangi bir işlevi çağrılırken bu parametrenin belirtilmesi gerekir, bu nedenle açıklamasıyla uğraşmayacağım.
Xp önekinin kullanılması gerekli değildir, ancak adlarını bildiğiniz acil durum kaydedilen prosedürün yetkisini arttırmak için kaydedilen genişletilmiş bir prosedür başlatmak iyi bir fikirdir. sp_ önekiyle başlayın.
Kaydedilen genişletilmiş prosedürlerin adlarının büyük/küçük harfe duyarlı olduğunu da hatırlamakta fayda var. Kaydedilen genişletilmiş prosedürü kullanırsanız bunu unutmayın, aksi takdirde elde edilen sonuç yerine düzeltmeyle ilgili bildirimi iptal edersiniz.
Dll başlatma/başlatmama kodunu yazmanız gerekiyorsa standart DllMain() işlevini kullanın. Eğer böyle bir ihtiyacınız yoksa ve DLLMain() yazmak istemiyorsanız, derleyici hiçbir şey yapmadan DLLMain() fonksiyonunun kendi versiyonunu seçecek ve sadece TRUE değerini döndürecektir. Dll'den (prosedür kaydetme uzantısı) çağrılan tüm işlevler dışa aktarılmış olarak bildirilir. MS Visual C++ ile yazıyorsanız direktifi vikorize edin __declspec(dllexport). Derleyici bu yönergeyi desteklemiyorsa, dışa aktarılan işlevi DEF dosyasının EXPORTS bölümünde açıklayın.
Yani projeyi oluşturmak için aşağıdaki dosyalara ihtiyacımız var:

  • Srv.h başlık dosyası, ODS API'sinin işlevlerinin ve makrolarının açıklamasını içerir;
  • Opends60.lib dosyası, ODS API tarafından sağlanan tüm hizmetleri uygulayan Opends60.dll kitaplığını içe aktarır.
Microsoft, tüm DLL'lerin dışa aktarılan işlevi kaydeden prosedür uzantılarını uygulamasını önemle önerir:

Declspec(dllexport) ULONG __GetXpVersion()
{
ODS_VERSION'ı döndür;
}

MS SQL Server, genişletilmiş saklı yordama sahip bir DLL kullandığında, kitaplık sürümü hakkında bilgi almak için ilk önce bu işlevi çağırır.

İlk genişletilmiş saklı yordamınızı yazmak için bilgisayarınıza yüklemeniz gerekir:

MS SQL Server 2000, hangi sürüm olursa olsun (Personal Edition kullanıyorum). Kurulum işlemi sırasında kaynak örnek seçeneğinin işaretini kaldırmalısınız.
- MS Visual C++ (sürüm 7.0 kullanıyorum), ancak bunun 6.0 sürümü olduğundan eminim

DLL'nizi test etmek ve geliştirmek için SQL Server -a'nın yüklenmesi gerekir. Bu arada kimseyi rahatsız etmeden daha iyi olmanız ve her şeyi yerel diskinize yüklemeniz mümkündür. Microsoft Visual C++ 7.0 Interprise Edition, Genişletilmiş Saklı Yordam DLL Sihirbazı'nı içerir. Prensip olarak, doğada hiçbir şey yapılmasına gerek yoktur, yalnızca kaydedilen genişletilmiş prosedür için bir şablon oluşturur. Fakhivtsi'yi seviyorsanız, vikoristovvat yogo yapabilirsiniz. Her şeyi ellerimle yapma iradem var ve bu kimsenin görebileceği bir sorun değil.

Şimdi kontrol etmek için:
- Visual C++'ı başlatın ve yeni bir proje oluşturun – Win32 Dinamik Bağlantı Kitaplığı.
- Proje başlık dosyasını ekleyin - #include ;
- Araçlar => Seçenekler menüsüne gidin ve dahil etme ve kitaplık dosyaları için seçenekler ekleyin. MS SQL Server'ı kurarken hiçbir şeyi değiştirmediyseniz şunu belirtin:

C:Program DosyalarıMicrosoft SQL Server80AraçlarDevToolsBaşlık dosyaları için dahil etme;
- C:Program FilesMicrosoft SQL Server80ToolsDevToolsLib, kitaplık dosyaları için.
- Bağlayıcı seçeneklerinde opends60.lib kitaplık dosyasının adını belirtin.

Hazırlık aşaması tamamlandıktan sonra ilk genişletilmiş saklı yordamınızı yazmaya başlayabilirsiniz.

Problem cümlesi.

Programlamaya başlamadan önce nereden başlayacağınızı, nihai sonucun ne olacağını ve buna nasıl ulaşacağınızı açıkça anlamalısınız. Daha fazla teknik bilgiye ihtiyacımız var:

MS SQL Server 2000 için, etki alanına kayıtlı istemcilerin yeni bir listesini seçen ve bunu standart bir kayıt kümesi (kayıt kümesi) gibi görünen bir biçimde istemciye döndüren genişletilmiş bir prosedür geliştirin. Fonksiyon, ilk giriş parametresi olarak, veritabanını etki alanı denetleyicisinin adı olan dizine (Active Directory) yerleştirecek sunucunun adını alır. Bu parametre hala NULL olduğundan istemciye yerel grupların bir listesini iletmek gerekir. Başarılı/başarısız işlemin sonucunun değerini döndürmek için genişletilmiş saklı prosedür tarafından başka bir parametre kullanılacaktır (OUTPUT parametresi). Giriş bilgilerinin başarılı bir şekilde kaydedilmesi için prosedür genişletilirse, robotik işlem sırasında gerekli bilgileri, başka bir parametrenin değerlerini kaldırmak mümkün değilse, bir dizi kaydın istemci kayıt setine aktarılması gerekir. Başarısız tamamlamanın bir işareti olarak -1 olarak ayarlanması tavsiye edilir.

Saldırıları önleyen genişletilmiş bir prosedürün zihinsel bir prototipi:

xp_GetUserList(@NameServer varchar, @CountRec int OUTPUT);


Bu da kaydedilen genişletilmiş prosedürün şablonudur ve bunu kendimize hatırlatmamız gerekir:

#katmak
#katmak
#define XP_NOERROR 0
#define XP_ERROR -1


__declspec(dllexport) SERVRETCODE xp_GetGroupList(SRVPROC* pSrvProc)
{

//geçilen parametre sayısını kontrol ediyoruz

//Geçirilen parametrelerin tipi kontrol ediliyor

//Parametre 2'nin ÇIKIŞ parametresi olup olmadığını kontrol edin

//Parametre 2'nin değeri kaydetmek için yeterli rezerve sahip olup olmadığını kontrol edin

//Giriş parametrelerini kaldırıyoruz

//Ottrimanya koristuvachі'yı listeliyor

// Veriyi istemciye standart bir kayıt seti olarak gönder

//ÇIKIŞ parametresinin değerinin ayarlanması

dönüş (XP_NOERROR);
}


Giriş parametreleriyle çalışma

Bu bölümde üçüncü tarafların konuşmalarına olan saygınızı kaybetmek istemiyorum ancak parametrelerle kaydedilen genişletilmiş bir prosedüre aktarılan çalışmaya odaklanmak istiyorum. Bu nedenle teknik bilgimize bir göz atalım ve sadece giriş parametreleriyle ilgili kısmı analiz edelim. İlk başta pek fazla teori yok

Gerçekleştirilebilecek ilk eylem, çağrıldığında kendisine iletilen parametreleri almak için genişletilmiş saklı yordamımızdır. İndüklenen algoritmayı takiben aşağıdaki eylemleri ortadan kaldırmamız gerekir:

Aktarılan parametrelerin sayısını hesaplayın;
- aktarılan parametrelerin doğru veri tipini içerdiğinden emin olun;
- ÇIKIŞ parametresinin yeterli değere sahip olup olmadığını kontrol edin, yeni bir değer kaydetmek için genişletilmiş saklı prosedürümüzü kullanın.
- aktarılan parametrelerin iptal edilmesi;
- Genişletilmiş saklı yordamın başarılı/başarısız tamamlanması sonucu çıkış parametresinin değerini ayarlayın.

Şimdi cilt noktasına daha yakından bakalım:

İletim sayısı, kaydedilen genişletilmiş prosedür parametreleriyle belirlenir.

Parametre aktarımlarının sayısını kaldırmak için işlevi seçmeniz gerekir:

int srv_rpcparams(SRV_PROC * srvproc);


Başarıyla tamamlanırsa işlev, genişletilmiş kayıtlı parametreler prosedüründen iletim sayısını tersine çevirir. Genişletilmiş bir saklı yordam parametresiz kullanılıyorsa - srv_rpcparams -1 olarak ayarlanır. Parametreler ada veya konuma (adsız) göre iletilebilir. Her durumda, iki yöntemi karıştıramazsınız. Giriş parametrelerini hemen isme ve konuma göre işleve aktarmaya çalışmak başarısızlıkla sonuçlanacak ve srv_rpcparams 0'a dönecektir.

Veri türüne ve iletilen parametre sayısına bağlı olarak

Tür hakkında bilgi almak için ve parametreleri ilettikten sonra Microsoft, srv_paramifo işlevinin kullanılmasını önerir. Bu evrensel işlev, eski kabul edilen srv_paramtype, srv_paramlen, srv_parammaxlen tıklamalarının yerini alır. Eksen її prototipi:

int srv_paraminfo(
SRV_PROC * srvproc,
int n,
BYTE * pbType,
ULONG* pcbMaxLen,
ULONG * pcbGerçekLen,
BYTE * pbVeri,
BOOL * pfNull);

pByte giriş parametresinin türü hakkında değişken içerik bilgisi göstergesi;
pbTürü parametrenin seri numarasını gösterir. İlk parametrenin numarası birinciyle başlar.
pcbMaxLen Herhangi bir fonksiyon maksimum parametrenin maksimum değerini girmeden önce değişikliği belirtin. Bu değer, iletilen parametrenin spesifik veri türü tarafından belirlenir, dolayısıyla OUTPUT parametresinin iletilen verileri kaydetmek için yeterli olup olmadığını kontrol edeceğiz.
pcbGerçekLen Genişletilmiş prosedüre aktarılan ve çağrıldığında kaydedilen parametrenin gerçek değerinin göstergesi. Aktarılan parametrenin değeri sıfırsa ve pfNull bayrağı FALSE olarak ayarlanmışsa (* pcbActualLen) ==0.
pbVerileri- srv_paraminfo tıklamasından önce hafızası görünen arabelleğe atama. Fonksiyonun genişletilmiş sıralı prosedürden giriş parametrelerini yerleştirdiği tampon. Bayt cinsinden arabellek boyutu pcbMaxLen değeriyle aynıdır. Bu ekleme parametresi NULL ise veriler arabelleğe yazılmaz ancak işlev *pbType, *pcbMaxLen, *pcbActualLen, *pfNull değerlerini doğru şekilde döndürür. Bu nedenle, srv_paraminfo'ya iki kez tıklamanız gerekir: önce pbData=NULL ile, ardından arabellek altında gerekli bellek boyutunu pcbActualLen'e eşit gördükten sonra tekrar srv_paraminfo'ya tıklayın ve pbData'yı bellek bloğu vizyonu 'yati' için bir gösterge olarak iletin.
pfNull NULL-ensign'da vkazivnik. srv_paraminfo, giriş parametresinin değeri hala NULL ise bunu TRUE olarak ayarlar.

Başka bir ÇIKIŞ parametresi ile kontrol edin.

srv_paramstatus() işlevi, iletilen parametrenin durumunu belirtmeyi amaçlamaktadır:

int srv_paramstatus (
SRV_PROC * srvproc,
int n
);

n çağrı altında genişletilmiş kayıtlı prosedüre aktarılan parametrenin numarası. Size şunu hatırlatmama izin verin: parametreler her zaman 1 olarak numaralandırılmıştır.
srv_paramstatus'un değerini döndürmek için değeri sıfıra ayarlayın. Parametre 1'e eklenirse ÇIKIŞ parametresi iletilecek ve değerlerin arkasına 0 parametresi geçilecektir. Genişletilmiş saklı yordam parametresiz kullanıldıysa işlev -1'e çevrilir.

Çıkış parametresinin değerini ayarlayın.

Genişletilmiş kaydetmeye iletilen çıktı parametresi, srv_paramsetoutput işlevi kullanılarak değerlere aktarılabilir. Bu yeni işlev, artık kullanılmayan srv_paramset işlevinin tıklamasının yerini alır, çünkü ODS API'sine eklenen yeni veri türlerini ve yeni verileri desteklemez.

int srv_paramsetoutput(
SRV_PROC *srvproc,
int n,
BYTE *pbVeri,
ULONG cbLen,
BOOL fNull
);

N yeni değerin atanacağı parametrenin seri numarası. Bu ÇIKIŞ parametresidir.
pbVerileriÇıkış parametresinin değerini ayarlamak için istemciye gönderilecek verileri içeren arabellek üzerindeki gösterge.
cbLen Dovzhina tampon haraçları, scho posylayutsya. Aktarılan OUTPUT parametresinin veri türü sürekli veri ise ve NULL değerlerin saklanmasına izin vermiyorsa (örneğin, SRVBIT veya SRVINT1), işlev cbLen parametresini yok sayar. cbLen=0 değeri sıfır değerini belirtir; bu, fNull parametresinin FALSE olarak ayarlandığı anlamına gelir.
fNull bunu TRUE olarak ayarlayın, çünkü döndürülen parametreye NULL değeri atanmalıdır, bu noktada cbLen'in değeri 0'a eşit olabilir, aksi takdirde fonksiyon mutlu bir şekilde sona erecektir. Yıl sonunda fNull=FALSE.
Başarılı olursa, işlev BAŞARILI sonucunu döndürür. Dönen değer FAIL'e benzerse, tıklama çok uzakta olmayacaktır. Her şey basit ve anlaşılır
Artık parametresinden geçen değerin değerini saklayacak kendi genişletilmiş prosedürümüzü yazacak kadar bilgimiz var. Geleneğin ötesine geçelim, bir dizi Merhaba dünya olacak! Poponun özelleştirilmiş versiyonunu buradan indirebilirsiniz.

#katmak

#define XP_NOERROR 0
#define XP_ERROR 1

#define MAX_SERVER_ERROR 20000
#define XP_HELLO_ERROR MAX_SERVER_ERROR+1

void printError(SRV_PROC*, CHAR*);

#ifdef __cplusplus
harici "C" (
#endif

SRVRETCODE __declspec(dllexport) xp_helloworld(SRV_PROC* pSrvProc);

#ifdef __cplusplus
}
#endif

SRVRETCODE xp_helloworld(SRV_PROC* pSrvProc)
{
char szText = "Merhaba Dünya!";
BYTE bTürü;
ULONG cbMaxLen;
ULONG cbGerçekLen;
BOOL fNull;

/* Genişletilmiş tasarruflardan yapılan transfer sayısının değeri
parametre prosedürü */
if (srv_rpcparams(pSrvProc) != 1)
{
printError(pSrvProc, "Parametre sayısı hatalı!");
dönüş (XP_ERROR);
}

/* Aktarılan parametre sayısı ve veri türü hakkında bilgi çıkarılması */
if (srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen,
&cbGerçekLen, NULL, &fNull) == BAŞARISIZ)
{
printError(pSrvProc,
"Giriş parametreleri hakkında bilgi almak mümkün değil...");
dönüş (XP_ERROR);
}

/* OUTPUT parametresinin aktarım sayısını parametreyle doğrularız */
if ((srv_paramstatus(pSrvProc, 1) & SRV_PARAMRETURN) == BAŞARISIZ)
{
printError(pSrvProc,
"Bir parametrenin iletilmesi bir ÇIKIŞ parametresi değildir!");
dönüş (XP_ERROR);
}

/* Geçirilen parametrenin veri tipi kontrol ediliyor */
if (bType != SRVBIGVARCHAR && bType != SRVBIGCHAR)
{
printError(pSrvProc, "Geçersiz parametre türü geçildi!");
dönüş (XP_ERROR);
}

/* Transfer parametresinin dönen satırı kaydetmeye yetecek kadar parası olacak şekilde yeniden dönüştürüldü */
eğer (cbMaxLen< strlen(szText))
{
printError(pSrvProc,
"Döndürülmekte olan n satırın kaydedilmesi için yeterli paranın bulunmaması parametresi geçildi!");
dönüş (XP_ERROR);
}

/* OUTPUT parametresinin değerini ayarlayın */
if (FAIL == srv_paramsetoutput(pSrvProc, 1, (BYTE*)szText, 13, FALSE))
{
printError(pSrvProc,
"ÇIKIŞ parametresinin değerini ayarlayamıyorum...");
dönüş (XP_ERROR);
}

srv_senddone(pSrvProc, (SRV_DONE_COUNT | SRV_DONE_MORE), 0, 1);
dönüş (XP_NOERROR);
}

void printError (SRV_PROC *pSrvProc, CHAR* szErrorMsg)
{
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, XP_HELLO_ERROR, SRV_INFO, 1,
NULL, 0, 0, szErrorMsg,SRV_NULLTERM);

Srv_senddone(pSrvProc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);
}

srv_sendmsg ve srv_senddone işlevleri dikkat edilmeden kayboldu. srv_sendmsg işlevi istemciye bildirimleri zorlamak için kullanılır. Eksen її prototipi:

int srv_sendmsg (
SRV_PROC * srvproc,
int msgtype,
DBINT msgnumu,
DBTINYINT sınıfı
DBTINYINT durumu,
DBCHAR * rpcadı,
int rpcnamelen,
DBUSMALLINT çamaşırları,
DBCHAR *mesajı,
int msglen
);

mesaj türü istemcinin alması istenen bildirimin türünü belirtir. SRV_MSG_INFO sabiti, bildirim bilgisi anlamına gelir ve SRV_MSG_ERROR, hatayla ilgili bildirim anlamına gelir;
msgnum bildirim numarası;
sınıf-Başlamış olan rahmetin şiddet derecesi. Şiddet düzeyine ilişkin bilgi 10'dan az veya fazla olabilir;
durum Sürekli bilgi için numarayı paylaşacağım. Bu parametre, ihtarın bağlamı hakkında bilgi sağlar. Kabul edilebilir değerler 0 ila 127 arasındadır;
rpcname şu anda vikorlaştırılmıyor;
rpcnamelen - şu anda vikorist yok;
keten Buraya çıkış kodunun satır numarasını girebilirsiniz. Bu değerler için de-vinikla derlemesi kurulumu kolay olacaktır. Bu özelliği kullanmak istemiyorsanız linenum'u 0 olarak ayarlayın;
mesaj müşterinin neler yapabileceğini gösteren bir satır gösterir;
msglen bilgi satırının bayt cinsinden son dakikası anlamına gelir. Bu satır boş bir karakterle bitiyorsa bu parametrenin değeri SRV_NULLTERM olarak ayarlanabilir.
Neyin dönmesi gerektiğinin anlamı:
- başarı elde edildiğinde BAŞARI
- Başarısız olursa BAŞARISIZ.

Sürecin genişletilmiş bir prosedürü vardır ve bu prosedür, müşteriye durumunuz hakkında düzenli olarak bilgi verilerek kaydedilir. Wikonya meseleleri hakkında daha fazla bilgi ekleyin. Bunun için srv_senddone işlevi atanmıştır:

int srv_senddone(
SRV_PROC * srvproc,
DBUSMALLINT durumu,
DBUSMALLINT bilgisi,
DBINT sayısı
);

durum durumu işareti. Bu parametrenin değeri, tablo yönlendirme sabitlerini birleştirmek için ek mantıksal operatörler AND ve OR kullanılarak belirtilebilir:
Durum bayrağı Açıklama
SRV_DONE_FINAL Sonuçların sürekli toplanması artıktır;
SRV_DONE_MORE Sonuçların sürekli toplanması, verilerin son kısmında artık iz bırakmaz;
SRV_DONE_COUNT Sayım parametresi doğru değere ayarlandı
SRV_DONE_ERROR Vikory, erteleme hakkında bildirimde bulunmak için oturum açtı ve tamamlanmadı.
içine rezervasyonlar için 0 ayarlamanız gerekir.
sayım, istemciye gönderilen sonuç veri kümelerinin sayısıdır. Kurulumların durumu SRV_DONE_COUNT'a atandığından, istemciye gönderilen setlerin doğru sayısını kayıtlara koymaktan count sorumludur.
Neyin dönmesi gerektiğinin anlamı:
- başarı elde edildiğinde BAŞARI
- Başarısız olursa BAŞARISIZ.

MS SQL Server 2000'e kaydedilen genişletilmiş prosedürlerin kurulması

1.Dll kütüphanesini genişletilmiş kayıtlı prosedürle birlikte MS SQL Server'ın kurulu olduğu makinedeki binn dizinine kopyalayın. Daha az saldırı yolu vardır: C:Program FilesMicrosoft SQL ServerMSSQLBinn;
2. Aşağıdaki komut dosyasını çalıştırarak sunucuya kaydedilen genişletilmiş bir prosedürü kaydedin:

KULLANIM Ana
SP_ADDEXTENDEDPROC xp_helloworld, xp_helloworld.dll'YI ÇALIŞTIRIN

Aşağıdaki betiği çalıştırarak xp_helloworld robotunu test edin:

DECLARE @Param varchar(33)
xp_helloworld @Param ÇIKIŞINI ÇALIŞTIRIN
OUTPUT_Param OLARAK @Param'ı SEÇİN


Visnovok

Yazımın ilk kısmı burada bitiyor. Şimdi şarkı söylüyorum, teknik departmanlarımızla %100 etkileşime geçmeye hazırsınız. Mevcut makalede şunları öğreneceksiniz:
- ODS API'sinde tanımlanan veri türleri;
- genişletilmiş tasarruf prosedürlerinin geliştirilmesinin özelliği;
- kayıt kümesinin nasıl oluşturulacağı ve bunların istemci uygulamasına nasıl aktarılacağı;
- Etki alanı sahiplerinin listesini elde etmek için gerekli olan Active Directory Ağ Yönetimi API'sinin işlevlerine kısaca bakacağız;
- Hazır proje oluşturabiliriz (teknik departmanımızla hayata geçiriyoruz)
Tatlı bir diş umuyorum!

Not: stüdyo 7.0 için istatistikler için popo dosyaları