Transact-SQL'de İmleçleri ve Döngüleri Kullanma. MySQL saklı yordamlarındaki imleçler SQL sunucusundaki imleçler

DECLARE CURSOR komutu, manipülasyon için bir tablodaki kayıtları satır satır almanızı sağlar. Bu, SQL'in yaptığı geleneksel veri kümesi işleme yerine satır satır işlemeye olanak tanır.

İlk yaklaşım olarak imleçle çalışırken aşağıdaki adımlar kullanılır.

İmleç DECLARE komutuyla oluşturulur. İmleç OPEN komutuyla açılır.

İmleçle yapılan işlemler FETCH komutu kullanılarak gerçekleştirilir. İmleç CLOSE komutuyla kapatılır.

DECLARE CURSOR komutu bir SELECT ifadesini belirtir. SELECT ifadesinin döndürdüğü her satır ayrı ayrı alınıp işlenebilir. Aşağıdaki Oracle örneği, diğer birçok değişkenle birlikte bir bildirim bloğundaki bir imleci bildirir. Bundan sonra, sonraki BEGIN...END bloğunda imleç açılır, ondan bir seçim yapılır ve imleç kapatılır.

CURSOR title_price_cursor IS SELECT başlık, fiyat FROM başlıklar

Fiyatın BOŞ DEĞİL OLDUĞU YERDE; title_price_val title_price_cursor ROWTYPE; new_price NUMBER(10.2);

AÇ title_price_Cursor;

FETCH title_price_cur-sor INTO title_price_val;

new_price:= "title_price_val.price" * 1.25 new_title_price DEĞERLERİNE EKLEYİN

(title_price_val.title, new_price) CLOSE title_price_cursor; SON;

Bu örnekte PL/SQL kullanıldığı için bu kitapta kodun çoğunu açıklamayacağız. Ancak DECLARE bloğu imleç bildirimini açıkça gösterir. Çalıştırılabilir bir PL/SQL bloğunda OPEN komutu ile imleç başlatılır, FETCH komutu ile değerler alınır ve son olarak CLOSE komutu ile imleç kapatılır.

SELECT deyimi imlecin temelidir, bu nedenle onu DECLARE CURSOR deyimine eklemeden önce iyice test etmek iyi bir uygulamadır. SELECT ifadesi temel tablo veya görünüm üzerinde çalışabilir. Bu nedenle salt okunur imleçler güncellenemeyen görünümlerle çalışabilir. Bir SELECT deyimi, ORDER BY, GROUP BY ve HAVING gibi tümcecikleri, bu tümcecikler kaynak tabloyu güncellemediği sürece içerebilir. İmleç FOR UPDATE olarak tanımlanmışsa, bu tür cümleciklerin SELECT deyiminden kaldırılması önerilir.

Yerel imleçler genellikle saklı yordamların çıktı parametreleri olarak kullanılır. Bu nedenle, bir saklı yordamda bir imleci tanımlayıp doldurabilir ve onu çağıran toplu işe veya saklı yordama aktarabilirsiniz.

Aşağıdaki basit DB2 örneğinde, "XO1" admin_group'undaki departman numaralarını, departman adlarını ve yönetici numaralarını arayan bir imleç tanımlayacağız.

DECLARE dept_cursor CURSOR

SEÇİM İÇİN bölüm_nbr, bölüm_adı, mgr_nbr

NEREDE admin_group = "X01"

ORDER BY d"ept_name ASC, dept_nbr DESC, mgr_nbr DESC;

Aşağıdaki Microsoft SQL Server örneği, yayımcılar tablosu için bir imleç bildirir ve açar. İmleç, Publishers tablosundaki SELECT deyimiyle eşleşen ilk kaydı seçer ve bunu başka bir tabloya ekler. Daha sonra tüm kayıtlar işlenene kadar bir sonraki kayda, ardından bir sonraki kayda geçer. Son olarak imleç kapatılır ve bellek serbest bırakılır (DEALLOCATE komutu yalnızca Microsoft SQL Server'da kullanılır).

DECLARE @yayıncı_adı VARCHAR(20)

Yayıncılardan yayın_adı SEÇMEK İÇİN pub_cursor İMLEÇİNİ BİLDİRİN NEREDE ülke "ABD"

SONRAKİ öğeyi pub_cursor'DAN yayıncı_adı'na getir

WHILE @s>FETCH_STATUS=0

INSERT INTO yabancı_yayıncılar VALUES("j>yayıncı_adı)

pub_cursor KAPATIN pub_cursor'U DEALLOCATE

Bu örnekte imlecin bir dizi kayıt üzerinde hareket ettiğini görebilirsiniz. (Bu örnek yalnızca fikri göstermeyi amaçlamaktadır, çünkü gerçekte En iyi yol Bu problemin çözümü INSERT, SELECT komutudur.)

ŞUNLAR İÇİN GEÇERLİDİR: SQL Server (2008'den beri)Base SQL verileri Azure SQL Veri AmbarıParalel Veri Ambarı

Görünüm özellikleri ve imlecin üzerinde çalıştığı sonuç kümesini oluşturmak için kullanılan sorgu gibi bir Transact-SQL sunucusu imlecinin niteliklerini tanımlar. DECLARE CURSOR ifadesi hem ISO standart söz dizimini hem de Transact-SQL dil uzantısı kümesini kullanan söz dizimini destekler.

ISO Söz Dizimi DECLARE imleç_adı [ DUYARLI DEĞİL ] [ KAYDIRMA ] seçme_ifadesi İÇİN İMLECİ [ FOR ( SADECE OKUYUN | UPDATE [ OF sütun_adı [ ,...n ] ] ) ] [;] Transact-SQL Genişletilmiş Söz Dizimi DECLARE imleç_adı İMLEÇ [ YEREL | GLOBAL ] [ FORWARD_ONLY | KAYDIR ] [ STATİK | ANAHTAR SETİ | DİNAMİK | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | İYİMLİ ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF sütun_adı [ ,...n ] ] ] [;]

imleç_adı
imleç_adı

DUYARSIZ
tempdb; bu nedenle, temel tablolardaki değişiklikler bu imlecin seçimleri tarafından döndürülen verilere yansıtılmaz ve bu imleç değiştirilemez. ISO sözdizimini kullanırken, INSENSITIVE seçeneği belirtilmediği sürece, temel tablolarda yapılan taahhütlü güncellemeler ve silmeler sonraki seçimlerde görünür.

TASLAK
Tüm örnekleme seçeneklerinin mevcut olduğunu belirtir (İLK, SON, ÖNCEKİ, SONRAKİ, BAĞIL, MUTLAK). ISO DECLARE CURSOR ifadesi bir SCROLL seçeneği belirtmiyorsa yalnızca NEXT fetch seçeneği desteklenir. SCROLL seçeneği FAST_FORWARD seçeneğiyle belirtilemez.

select_statement
Bir imlecin sonuç kümesini belirten standart bir SELECT ifadesi. FOR BROWSE ve INTO anahtar kelimelerine izin verilmez select_statement imleç bildirimi.

select_statement istenen türden bir imleçle çakışıyor.

SADECE OKU

Güncelleme ]
sütun adı [, .. .N] belirtildiğinde yalnızca listelenen sütunlar değişiklik yapılmasına izin verir. UPDATE deyimi sütun listesi olmadan kullanılırsa güncelleme tüm sütunlar için mümkündür.

imleç_adı
Belirli sunucu imlecinin Transact-SQL adı. imleç_adı tanımlayıcılara ilişkin kurallara uymalıdır.

YEREL
İmlecin oluşturulduğu pakette, saklı yordamda veya tetikleyicide yerel olduğunu belirtir. İmleç adı yalnızca bu alan içinde geçerlidir. Bir imlece paket yerel değişkenleri, saklı yordamlar, tetikleyiciler veya saklı yordamın çıkış parametresi tarafından başvurulabilir. OUTPUT parametresi, yerel bir imleci çağıran pakete, saklı yordama veya tetikleyiciye geçirmek için kullanılır; bu, saklı yordam tamamlandıktan sonra imlece daha sonra erişim için parametreyi bir imleç değişkenine atayabilir. İmleç OUTPUT parametresine geçirilmediği sürece, toplu iş, saklı yordam veya tetikleyici yürütmeyi tamamladığında imleç örtülü olarak serbest bırakılır. İmleç ÇIKIŞ parametresine geçirildiyse, onu referans alan tüm değişkenler serbest bırakıldığında veya kapsamdan çıkıldığında imleç serbest bırakılır.

KÜRESEL
İmlecin bağlantıda genel olduğunu gösterir. İmleç adı, bağlantıda çalışan herhangi bir saklı yordam veya paket tarafından kullanılabilir. İmleç yalnızca bağlantı kesilirse örtülü olarak serbest bırakılır.

SADECE İLERİ
İmlecin yalnızca ilk satırdan son satıra kadar görüntülenebileceğini belirtir. Yalnızca FETCH NEXT getirme seçeneği desteklenir. FORWARD_ONLY STATIC, KEYSET veya DİNAMİK anahtar sözcükleri olmadan belirtilirse, imleç DİNAMİK imleç gibi davranır. FORWARD_ONLY bağımsız değişkeni veya SCROLL bağımsız değişkeni belirtilmemişse, STATIC, KEYSET veya DYNAMIC anahtar sözcükleri mevcut olmadığı sürece varsayılan FORWARD_ONLY bağımsız değişkenidir. STATIC, KEYSET ve DİNAMİK imleçlerin varsayılan değeri SCROLL'dur. ODBC ve ADO gibi veritabanı API'lerinden farklı olarak FORWARD_ONLY modu aşağıdaki Transact-SQL imleçleri tarafından desteklenir: STATIC, KEYSET ve DYNAMIC.

STATİK
İmleç tarafından kullanılmak üzere verilerin geçici bir kopyasını oluşturan bir imleci tanımlar. İmlece yapılan tüm sorgular, belirtilen geçici tabloya erişir. tempdb; bu nedenle, temel tablolardaki değişiklikler bu imlecin seçimleri tarafından döndürülen verilere yansıtılmaz ve bu imleç değiştirilemez.

ANAHTAR SETİ
İmleç açıldığında satırların üyeliğinin veya sırasının değişmediğini belirtir. Satırları benzersiz şekilde tanımlayan bir dizi anahtar, tablonun içine yerleştirilmiştir. tempdb isminde anahtarlar.

Temel tablolardaki anahtar olmayan değerlerde imleç sahibi tarafından yapılan veya diğer kullanıcılar tarafından yapılan değişiklikler, imleç sahibi bunu görüntülediğinde görüntülenir. Diğer kullanıcılar tarafından yapılan değişiklikler yansıtılmaz (Transact-SQL sunucusu imleci kullanılarak değişiklik yapılamaz). Bir satır silinirse, satırları getirmeye çalışmak @@FETCH_STATUS -2 değerini döndürür. İmleç sınırları boyunca anahtar değerlerde yapılan güncellemeler, eski bir satırı silip ardından yeni bir satır eklemeye benzer. Yeni değerlere sahip satır görünmez ve eski değerlere sahip satırı getirmeye çalışır, @@FETCH_STATUS -2 değerini döndürür. Güncellemeler, WHERE CURRENT OF cümleciği kullanılarak imleç aracılığıyla yapılırsa hemen görünür.

DİNAMİK
Bu imleci görüntülerken sonuç kümesindeki satırlarda yapılan tüm veri değişikliklerini görüntüleyen bir imleç tanımlar. Her seçimdeki veri değerleri, sıra ve satır üyeliği farklılık gösterebilir. MUTLAK seçim seçeneği dinamik imleçler tarafından desteklenmez.

İLERİ SAR
Performans optimizasyonunun etkin olduğu FORWARD_ONLY, READ_ONLY imlecini gösterir. FAST_FORWARD seçeneği SCROLL veya FOR_UPDATE seçenekleriyle belirtilemez.

SADECE OKU
Bu imleç aracılığıyla yapılan değişiklikleri engeller. WHERE CURRENT OF yan tümcesi UPDATE veya DELETE deyimindeki bir imlece başvuruda bulunamaz. Bu seçenek, varsayılan imleç yenileme özelliğine göre önceliklidir.

SCROLL_LOCKS
İmleç kullanılarak yapılan konumlandırılmış güncellemelerin veya silme işlemlerinin başarılı olacağının garanti edildiğini belirtir. SQL Server, satırların sonraki değişiklikler için kullanılabilir olmasını sağlamak amacıyla imleçte okundukça satırları kilitler. SCROLL_LOCKS seçeneği FAST_FORWARD veya STATIC seçeneğiyle belirtilemez.

İYİMSER
Satır imlece okunduktan sonra güncellendiyse, imleç kullanılarak yapılan konumlandırılmış güncellemelerin veya silme işlemlerinin başarısız olacağını belirtir. SQL Server, imleçte okunan satırları kilitlemez. Bunun yerine karşılaştırmalar kullanılıyor zaman damgası sütun değerleri veya sağlama toplamları, eğer tabloda değilse zaman damgası imlece okunduğundan beri satırın değişip değişmediğini belirlemek için sütun. Satır değiştirilmişse, konumlandırılmış güncelleme veya silme girişimleri başarısız olur. OPTIMISTIC seçeneği FAST_FORWARD seçeneğiyle belirtilemez.

TYPE_WARNING
İmlecin örtülü olarak istenen bir türden diğerine dönüştürülmesi durumunda istemciye bir uyarı gönderileceğini belirtir.

select_statement
Bir imlecin sonuç kümesini belirten standart bir SELECT ifadesi. COMPUTE, COMPUTE BY, FOR BROWSE ve INTO anahtar kelimelerine izin verilmez. select_statement imleç bildirimi.

SQL Server, içindeki tümcecikler varsa imleci örtülü olarak başka bir türe dönüştürür. select_statement istenen türden bir imleçle çakışıyor. Daha fazla bilgi için bkz. Örtülü İmleç Dönüşümleri.

GÜNCELLEME İÇİN ]
Güncellenecek imleçteki sütunları tanımlar. Eğer OF ise sütun adı [, ... N] sağlanmışsa, yalnızca listelenen sütunlar değişiklik yapılmasına izin verir. UPDATE deyimi sütun listesi olmadan kullanılırsa READ_ONLY eşzamanlılık seçeneği belirtilmediği sürece tüm sütunlar için güncelleme mümkündür.

DECLARE CURSOR ifadesi, Transact-SQL sunucusu imlecinin görünüm özellikleri ve imlecin üzerinde çalıştığı sonuç kümesini oluşturmak için kullanılan sorgu gibi niteliklerini tanımlar. OPEN ifadesi sonuç kümesini doldurur ve FETCH ifadesi bundan bir satır döndürür. CLOSE ifadesi, imleçle ilişkili geçerli sonuç kümesini temizler. DEALLOCATE ifadesi imlecin kullandığı kaynakları serbest bırakır.

DECLARE CURSOR ifadesinin ilk biçimi, imleç parametrelerini belirtmek için ISO sözdizimini kullanır. DECLARE CURSOR ifadesinin ikinci biçimi, ODBC ve ADO gibi veritabanı API'lerinin imleç işlevlerinde kullanılanlarla aynı türleri kullanarak imleçleri tanımlamanıza olanak tanıyan Transact-SQL dilinin uzantılarını kullanır.

Bu iki form karıştırılamaz. CURSOR anahtar sözcüğünden önce SCROLL belirtirseniz veya anahtar sözcükleri atlarsanız, CURSOR ile ayrıca için anahtar sözcükleri kullanamazsınız. select_statement anahtar kelimeler. İMLEÇ arasında anahtar kelimeler belirtirken ve ayrıca select_statement anahtar sözcükleri kullanıyorsanız, CURSOR anahtar sözcüğünden önce SCROLL veya INSENSITIVE belirtemezsiniz.

DECLARE CURSOR deyimi için Transact-SQL söz dizimini kullanırsanız ve READ_ONLY, OPTIMISTIC veya SCROLL_LOCKS seçeneklerini belirtmezseniz, aşağıdaki varsayılan değer varsayılır.

    SELECT ifadesi güncellemeleri desteklemiyorsa (veya yetersiz izinlere sahipse veya güncellemeleri desteklemeyen uzak tablolara vb. erişiyorsa), imleç READ_ONLY olarak ayarlanır.

    STATIC ve FAST_FORWARD imleçleri varsayılan olarak READ_ONLY'dir.

    DİNAMİK ve TUŞ AYARI imleçleri varsayılan olarak İYİMLİ'dir.

İmleçlere yalnızca diğer Transact-SQL ifadeleri tarafından başvurulabilir. Veritabanı API işlevleri imleçlere başvuramaz. Örneğin, bir imleç bildirildiğinde OLE DB, ODBC veya ADO işlevleri ve yöntemleri bu imlecin adına başvuramaz. İmleç satırları, ilgili API işlevleri ve yöntemleri kullanılarak seçilemez; Bu amaçla Transact-SQL FETCH ifadelerini kullanmanız gerekir.

Bildirildikten sonra bir imlecin özelliklerini tanımlamak için aşağıdaki saklı yordamlar kullanılabilir.

Değişkenler parça olarak kullanılabilir select_statement imlecin bildirildiği yer. İmleç değişkenlerinin değerleri bildirildikten sonra değişmez.

Varsayılan olarak DECLARE CURSOR izinleri, imleç tarafından kullanılan görünümler, tablolar ve sütunlar üzerinde SELECT iznine sahip olan tüm kullanıcılara verilir.

Kümelenmiş sütun deposu dizinine sahip bir tabloda imleçleri veya tetikleyicileri kullanamazsınız. Bu sınırlama, kümelenmemiş dizinler için geçerli değildir; Kümelenmemiş bir sütun deposu dizinine sahip bir tabloda imleçleri ve tetikleyicileri kullanabilirsiniz.

A. Basit bir imleç ve sözdizimi kullanma

Bu imleci açtığınızda oluşturulan sonuç kümesi, tablonun tüm satır ve sütunlarını içerir. Bu imleç güncellenebilir; tüm güncellemeler ve silmeler bu imlecin seçiminde temsil edilir. FETCH``NEXT yalnızca SCROLL parametresi belirtilmediği için getirilir.

vend_cursor SEÇİM İÇİN İMLEÇİ BİLDİRİN * Satın Almadan.Vendor OPEN vend_cursor vend_cursor'DAN SONRAKİ FETCH;

B. Bir raporu görüntülemek için iç içe geçmiş imleçlerin kullanılması

Aşağıdaki örnek, karmaşık bir raporu görüntülemek için iç içe geçmiş imleçleri kullanır. Her sağlayıcı için dahili bir imleç bildirilir.

NOCOUNT'U AÇIK AYARLAYIN; DECLARE @vendor_id int , @vendor_name nvarchar ( 50 ), @message varchar ( 80 ), @product nvarchar ( 50 ); YAZDIR" -------- Satıcı Ürün Raporu --------"; Satıcı Kimliğini Seçmek İçin satıcı_imleç İMLEÇİNİ BİLDİRİN, Satın Almadan Ad. Satıcı NEREDE Tercih EdilenVendorStatus = 1 Satıcı Kimliğine Göre Sipariş; Satıcı_imlecini AÇ satıcı_imlecinden SONRAKİ ÜRÜNÜ @vendor_id, @vendor_name WHILE @@FETCH_STATUS = 0'a getirin YAZDIRMAYA BAŞLA " " SEÇ @mesaj = "----- Satıcının Ürünleri: "+ @satıcı_adı YAZDIR @mesaj -- Bir iç imleç tabanlı olarak bildir -- dış imleçten satıcı_kimliği üzerinde. Satınalma.ÜrünSatıcısından pv, Üretim.Ürün v NEREDE pv.ÜrünKimliği = v.ÜrünKimliği VE pv.SatıcıKimliği = @vendor_id'DEN SEÇİM İÇİN ürün_imleci İMLEÇİNİ BİLDİRİN -- Dış imleçteki değişken değer Product_cursor'U AÇIN, Product_cursor'DAN SONRAKİ ÜRÜNÜ @product IF @@FETCH_STATUS İÇİNE GETİRİN<>0 YAZDIR"<>" WHILE @@FETCH_STATUS = 0 BAŞLA @message = " " + @product YAZDIR @message SONRAKİ ÜRÜNÜproduct_cursor'DAN @product_cursor'A FETCH END KAPAT Product_cursor'U DEALLOCATE Product_cursor -- Sonraki satıcıyı al. Satıcı_imlecinden SONRAKİ ÜRÜNÜ @vendor_id, @vendor_name'E GETİR END KAPAT satıcı_imleci; DEALLOCATE satıcı_imleci;


İmleç bağlamsal hafıza alanına bir bağlantıdır. SQL programlama dilinin bazı uygulamalarında (Oracle, Microsoft SQL Server) - bir sorgu yürütülürken elde edilen sonuç kümesi ve bununla ilişkili geçerli kayıt işaretçisi. İmlecin alternatif bir veri depolamayı temsil eden sanal bir tablo olduğunu söyleyebilirim. Bu durumda imleç, verilere sanki normal bir dizinin verileriymiş gibi erişmenizi sağlar.
İmleçler saklı prosedürlerde kullanılır. Bu kadar teori yeter, bir örneğe bakalım:
Bir veritabanımız var (veritabanı pek iyi değil, bu benim laboratuvar işi ancak veri tabanı öğretmenimiz böyle bir yapı üzerinde ısrar etti)
/*banka bilgisi*/
TABLO OLUŞTUR "banka" (

`BankaAdı` VARCHAR (50) COLLATE utf8_bin NULL DEFAULT DEĞİL "",


BİRİNCİL ANAHTAR ("Banka Kimliği")

)MOTOR=InnoDB
KARAKTER SETİ "utf8" HARMANLA "utf8_bin" ;
/*mevduat verileri */
'banka dağıtımı' TABLOSUNU OLUŞTUR (
'Banka Kimliği' TAM SAYI (11) BOŞ DEĞİL ,
'Persent' TAM SAYI (11) VARSAYILAN BOŞ ,
`ContributeAmount` ONDALIK (10,0) BOŞ DEĞİL ,
'ClientId' TAM SAYI (11) BOŞ DEĞİL ,
BİRİNCİL ANAHTAR('BankaKimliği', 'MüşteriKimliği'),
KEY 'BankId' ('BankId'),
ANAHTAR 'ClientId' ('ClientId'),
KISITLAMA `bankdistribution_fk` YABANCI ANAHTAR (`BankId`) REFERANSLAR `bank` (`BankId`),
KISITLAMA `bankdistribution_fk1` YABANCI ANAHTAR (`ClientId`) REFERANSLAR `client` (`ClientId`)
)MOTOR=InnoDB
/*yatırımcılara ilişkin veriler*/
TABLO OLUŞTUR 'istemci' (
'ClientId' INTEGER (3) NULL DEĞİL AUTO_INCREMENT,
'CreditCardId' BIGINT(10) BOŞ DEĞİL ,
`Soyadı` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "",
`Ad` VARCHAR (50) COLLATE utf8_bin NULL DEFAULT DEĞİL "",
`FirstName` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "",
`Telefon` VARCHAR (50) COLLATE utf8_bin NULL DEFAULT DEĞİL "" ,
`Adres` VARCHAR (50) COLLATE utf8_bin NULL DEFAULT DEĞİL "" ,
'Güvenli Kimlik' TAM SAYI (5) BOŞ DEĞİL,
BİRİNCİL ANAHTAR('ClientId', 'CreditCardId'),
ANAHTAR 'ClientId' ('ClientId')

)MOTOR=InnoDB
AUTO_INCREMENT=11 KARAKTER SETİ "utf8" HARMANLA "utf8_bin"

Diyelim ki her bankayı sırayla alıp bazı işlemler yapmamız gerekiyor, aşağıdaki sorgu bize bu konuda yardımcı olabilir

`Banka`yı seçin.* `BANKA`DAN İHTİYACIMIZ OLAN_KAYIT_SINIR SAYISI,1
. Böylece LIMIT WE NEED_RECORD NUMBER, 1 kullanarak WE NEED_RECORD NUMBER değerini 1 arttırarak banka tablosundan bir döngüdeki her kaydı sırayla çıkarıyoruz ve onunla ihtiyacımız olan işlemleri gerçekleştiriyoruz. Şimdi de aynısını yapacağız ama imleç kullanarak
Başlamak
/* verileri çıkaracağımız değişkenler */
vBankId tamsayısını bildirin;
vBankName VARCHAR(50)'ı bildirin;
vAddress VARCHAR(50)'ı bildirin;
vPhone VARCHAR'ı (50) bildirin;
/* hadler değişkeni - a*/
Tamamlanan tamsayı varsayılanını 0 olarak bildirin;
/*İmleç bildirimi*/
`Bank`.`Bank`Id`,`bank`.`BankName`,`bank`.`Address`,`bank`.`Phone`, FROM `bank`'ı seçin, burada 1;
/*AŞAĞIDA AÇIKLANACAK HANDLER amacı*/
SQLSTATE "02000" İÇİN DEVAM İŞLEYİCİSİ BİLDİRİN SET tamamlandı=1;
/* imleci aç */
Banka İmlecini açın;
/*verileri al*/
Bittiğinde = 0 YAPIN

ihtiyacımız olan aksiyonları alıyoruz
SON ZAMAN ;
/*imleci kapatıyoruz*/
Banka İmlecini Kapatın;
SON ;

* Bu kaynak kodu Kaynak Kodu İşaretleyici ile vurgulanmıştır.

Hata: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

Mesaj: Veri yok - sıfır satır getirildi, seçildi veya işlendi

SQLSTATE: 02000, imlecin sonuna ulaşıldığında veya seçme veya güncelleme boş bir dize döndürdüğünde etkinleşir.

Sonraki satırda imleci deklare ettik DECLARE imleç_adı CURSOR FOR select_statement;
İmleci aç İmleç_adı'nı aç;
Daha sonra imlecin sonuna ulaşana kadar (WHILE do = 0 DO) verileri çıkartıp işleriz.
Saklı yordamdan çıkmadan önce imleci kapatmalısınız. İmleç_adı'nı kapat;

Karmaşık görünmüyor. Ancak SQLSTATE "02000" ile ilgili birçok tuzak var.

Bittiğinde = 0 YAPIN
Banka İmlecini vBankId,vBankName,vAddress,vPhone'A GETİR;

Banka dağıtımından vContributeAmountSUM İÇİNE (ContributeAmount) öğesini seçin; burada BankId = vBankId limit 1;
bazı eylemler yapıyoruz
SON ZAMAN ;

* Bu kaynak kodu Kaynak Kodu İşaretleyici ile vurgulanmıştır.


Sözdizimi açısından her şey yolunda ve doğrudur. Ama mantıksal açıdan bakıldığında hayır. Mevduat sahiplerinin bazı bankalarda hesap açmamış olması mümkündür, daha sonra Select (ContributeAmount) INTO vContributeAmountSUM FROM banka dağıtımı için burada BankId = vBankId limit 1; SQLSTATE: 02000 çalışacak, done değişkeni 1'e ayarlanacak ve while döngüsü beklediğimizden daha erken bitecek. Aşağıdakileri yaparak bu önlenebilir
Bittiğinde = 0 YAPIN
Banka İmlecini vBankId,vBankName,vAddress,vPhone'A GETİR;
/* banka için mevduatlarının tutarını çıkar */


eğer (vContributeAmountSUM > 0) o zaman
/* banka için mevduatlarının tutarını çıkar */

eğer biterse;
bazı eylemler yapıyoruz
SON ZAMAN ;

* Bu kaynak kodu Kaynak Kodu İşaretleyici ile vurgulanmıştır.


İlk istekte katkı olup olmadığını kontrol ettik (yoksa vContributeAmountSUM == 0) ve yalnızca varsa verileri alıyoruz.

Şimdi her müşteri için farklı banka hesaplarındaki toplam tutarı kaldırmamız gerektiğini varsayalım.
Toplamı seç için ClientSummCursor İmlecini Bildir

Toplamı seçin (`bankdistribution`.`ContributeAmount`), `bankdistribution`.`ClientId` FROM `bankdistribution` Inner join client on (client.ClientId = bankdistribution.`ClientId`) için ClientSummCursor İmlecini bildirin, burada 1 grup `bankdistribution'a göre. 'Müşteri Kimliği';

ClientSummCursor'u açın;
Bittiğinde = 0 YAPIN
Banka İmlecini vBankId,vBankName,vAddress,vPhone'A GETİR;
/* banka için mevduatlarının tutarını çıkar */
Banka dağıtımından Count(ContributeAmount) INTO vContributeAmountSUM'u seçin; burada BankId = vBankId limit 1;
/* bu bankada gerçekten mevduat olup olmadığını kontrol edin */
eğer (vContributeAmountSUM > 0) o zaman
/* banka için mevduatlarının tutarını çıkar */
Banka dağıtımından ContributeAmount INTO vContributeAmountSUM'u seçin; burada BankId = vBankId limit 1;
eğer biterse;


bazı eylemler yapıyoruz.
SON ZAMAN ;

* Bu kaynak kodu Kaynak Kodu İşaretleyici ile vurgulanmıştır.

ClientSummCursor imlecindeki verinin BankCursor içindeki veriden daha erken bitmesi, SQLSTATE: 02000 tetiklenmesi, done değişkeninin 1 yapılması ve while döngüsünün beklediğimizden erken bitmesi durumunda da aynı durum ortaya çıkabilir. Aşağıdakileri yaparak bu önlenebilir

ClientSummCursor'u açın;
Bittiğinde = 0 YAPIN
Banka İmlecini vBankId,vBankName,vAddress,vPhone'A GETİR;
/* banka için mevduatlarının tutarını çıkar */
Banka dağıtımından Count(ContributeAmount) INTO vContributeAmountSUM'u seçin; burada BankId = vBankId limit 1;
/* bu bankada gerçekten mevduat olup olmadığını kontrol edin */
eğer (vContributeAmountSUM > 0) o zaman
/* banka için mevduatlarının tutarını çıkar */
Banka dağıtımından ContributeAmount INTO vContributeAmountSUM'u seçin; burada BankId = vBankId limit 1;
eğer biterse;
/* ikinci imleçten veri çıkarmadan önce sqlstate durumunu hatırla */
SET old_status = tamamlandı;
/* ihtiyacımız olan verileri çıkarıyoruz */
ClientSummCursor'ı vSum,vClientId'E GETİR;
/* verinin alınıp alınmadığını ve sqlstate 0200'ün başarısız olup olmadığını kontrol edin */
eğer (tamamlandı = 0) o zaman
bazı eylemler yapıyoruz.
eğer biterse;
/* while'ın bitiminden önce, yapılan değişkenin değerini geri yükle */
ayarlandı = old_status;
SON ZAMAN ;

* Bu kaynak kodu Kaynak Kodu İşaretleyici ile vurgulanmıştır.

Buraya kadar okuyan herkese teşekkür ederim, umarım birilerine faydalı olur.

Bir veritabanında imlecin uygulanması, bir dizi veri ve onu işlemek için yöntemler içeren bir Java sınıfına benzer. burada SQL imleci verileri normal bir dizi olarak kullanır. İmleçler tetikleyicilerde, saklı prosedürlerde ve işlevlerde kullanılabilir.

SQL standardına uygun olarak imleçlerle çalışırken aşağıdaki temel eylemler gerçekleştirilir:

  • imleç bildirimi;
  • verileri okuyan bir imlecin açılması;
  • imleçten satır satır veri örneklemesi;
  • imleci kullanarak satır verilerini değiştirme;
  • imlecin kapatılması, ardından erişilemez hale gelmesi;
  • imleci serbest bırakmak, yani Bir imleci bellekten kaldırmak, çünkü onu kapatmak, onunla ilişkili belleği mutlaka boşaltmaz.

Farklı uygulamalarda tanım imleç bazı farklılıklar olabilir. Örneğin, bazen bir imleç için ayrılan belleği açıkça boşaltmak gerekebilir. İmleç serbest bırakıldığında onunla ilişkili bellek de serbest bırakılır. Bu, imleç adının yeniden kullanılmasını mümkün kılar. Diğer uygulamalarda imleç kapatıldığında bellek örtülü olarak serbest bırakılır.

Bazı durumlarda imleç kullanmadan yapamazsınız. Ancak mümkünse imleç kullanmaktan kaçınmalı ve standart veri işleme komutlarıyla çalışmalısınız: SELECT, UPDATE, INSERT, DELETE. Bunun nedeni, imleçlerin tüm veri hacmi üzerinde değişiklik işlemlerine izin vermemesi ve imleç kullanılarak veri işleme işlemlerinin gerçekleştirilme hızının, imleçlerinkinden belirgin şekilde daha düşük olmasıdır. standart araçlar SQL.

Bir program imlece yüklenen verileri değiştirebiliyorsa buna değiştirilebilir denir. İmleçlerden bahsederken işlem izolasyonunu unutmamalıyız. Bir kullanıcı bir imleci kullanarak bir kaydı düzenlerken, diğer bir kullanıcı kendi imlecini kullanarak o kaydı okuyor. Üstelik aynı kaydı değiştirebilir, bu da veri bütünlüğünün korunmasını gerekli kılar.

Bir imleç bildirmek

İmleçlerin kullanılmadan önce bildirilmesi gerekir. SQL standardı, imleç oluşturmak için aşağıdaki sözdizimini kullanır:

Select_statement için imleç_adı imlecini bildirin])]

Bu ifade bir imleç bildirir imleci bildir"imleç_adı" adıyla.

DUYARSIZ değişiklik yapılmasına izin vermeyen statik bir imleç oluşturulur. Ayrıca diğer kullanıcılar tarafından yapılan değişiklikler görüntülenmez. INSENSITIVE anahtar sözcüğü eksikse dinamik bir imleç oluşturulur.

Bir anahtar kelime kullanırken TASLAK oluşturulan imleç herhangi bir yönde kaydırılarak herhangi bir seçim komutunu uygulamanıza olanak tanır. Bu argüman atlanırsa imleç sıralı olacaktır, yani. görüntülemesi baştan sona yalnızca tek yönde mümkün olacaktır.

İfade select_statement select ... from ... gibi bilgilerin okunmasına yönelik bir yapıyı belirtir. Operatörü içermemelidir içine, imlecin kendi operatörü olduğundan gidip getirmek değişkenleri imleç verileriyle doldurmak için.

Bir argüman belirtirken READ_ONLY İÇİN salt okunur bir imleç oluşturulacak ve verilerde hiçbir değişiklik yapılmasına izin verilmeyecektir. Dinamik bir imleç, başka bir kullanıcı tarafından yapılan değişikliklerin görüntülenmesine olanak tanıyan salt okunur bir imleç olarak bildirilebilir.

Argümanla bir imleç oluşturma GÜNCELLEME İÇİN imleçteki verilerde belirtilen sütunlarda veya bir argümanın yokluğunda değişiklik yapmanızı sağlar OF sütun_adı, tüm sütunlarda.

Bir alt programda birden fazla imleç bildirebilirsiniz. Ancak her imlecin benzersiz bir adı olmalıdır. Bir imleci açmak için operatörü kullanmanız gerekir açıkönceden bildirilen imleci açar:

İmleç açık

SQL, bir imleci açmak için aşağıdaki sözdizimini tanımlar:

İmleç_adı'nı açın;

Bir imleçten veri getiriliyor, imleç getiriliyor

Bir imleçten bazı değişkenlere veri okumak için kullanılan sözdizimi aşağıdaki gibidir:

İmleç_adı'nı var_adı [, var_adı] içine getir ...;

Şebeke gidip getirmek açık imleç verilerini, sonrasında bulunan değişkenlere seçer içine ve imleci bir sonraki konuma taşır.

İmleç kapat

Şebeke kapalı imleci kapatır. Operatör açıkça belirtilmemişse ilgili program bloğu kapatıldığında imleç otomatik olarak kapatılır.

İmleç_adı'nı kapat;

Kapattıktan sonra imleç erişilemez hale gelir. Kapatırken, imleç çalışırken takılı olan tüm kilitler serbest bırakılır. Yalnızca açık imleçler kapatılabilir. Kapalı ancak serbest bırakılmamış bir imleç yeniden açılabilir. Açılmamış bir imlecin kapatılmasına izin verilmez.

Her DBMS'nin imleç kullanma konusunda kendine özgü özellikleri vardır.

Oracle'da imleç kullanmanın özellikleri

PL/SQL'de dört imleç özelliği vardır %KURMAK, %BULUNAMADI, %AÇIK Ve %ROWCOUNT. İmleç nitelikleri, %TYPE ve %ROWTYPE operatörleri gibi, imleç adının sağında bildirilir.

%FOUND özelliği

%NOTFOUND özelliği

%NOTFOUND özelliği %FOUND'un tam tersidir.

%ISOPEN özelliği

%ISOPEN özelliği yalnızca imlecin açık olup olmadığını gösterir.

%ROWCOUNT özellik

Bağlanmak %ROWCOUNT belirli bir zamanda imleç tarafından okunan satır sayısını döndüren sayısal bir özelliktir.

Oracle DBMS'deki SQL imleci örneği

v_id müdürlerini bildirin.id %TYPE; v_name labels.name%TYPE; v_comm müdürleri.comm%TYPE; crs imleci, "2014-11-01" ve "2014-11-30" arasındaki verilerin kimliğe, isme göre gruplandırıldığı yöneticilerden iletişim olarak kimlik, ad, toplam(iletişim) seçmek için; açık crs'yi başlat; döngü ÇIKIŞ WHEN crs%NOTFOUND; crs'yi v_id, v_name, v_comm'a FETCH; bonus(id, name, comm) değerlerine (crs.id, crs.name, crs.comm) ekleyin; son döngü; işlemek; crs'yi kapat; son;

SQL sunucusunda imleç kullanmanın özellikleri

MSSQL'de kullanılan imleçler sıralı veya kaydırılabilir olabilir. Sıralı, verileri baştan sona yalnızca tek bir yönde seçmenize olanak tanır. Kaydırılabilir imleçler her iki yönde harekete izin verir ve imlecin sonuç kümesinde isteğe bağlı bir satıra atlamanıza olanak tanır.

SQL Server statik, dinamik, sıralı ve tuş takımına dayalı imleçleri destekler.

Statik imleç tasarımında bilgi, zamanın belirli bir noktasında anlık görüntü olarak saklanır. Bu nedenle başka bir kullanıcının veritabanında yaptığı değişiklikler görülmez. İmleç açılırken sunucu, tam sonuç kümesindeki tüm satırlara bir kilit koyar. Statik imleç oluşturulduktan sonra değişmez ve her zaman açıldığı anda mevcut olan veri kümesini görüntüler. Diğer kullanıcıların kaynak tablodaki imleçte yer alan verileri değiştirmesi durumunda, bu durum statik imleci etkilemeyecektir. Statik bir imleçte değişiklik yapmak imkansızdır, dolayısıyla her zaman salt okunur modda açılır.

Dinamik bir imleç, ek ağ yükü ve yazılım kaynakları gerektirir. Dinamik imleçler kullanıldığında verilerin tam bir kopyası oluşturulmaz, ancak kaynak tablolardan seçimler yalnızca kullanıcı belirli verilere eriştiğinde gerçekleştirilir. Getirme sırasında sunucu satırları kilitler ve kullanıcının imlecin tam sonuç kümesinde yaptığı değişiklikler imleçte görünür. Ancak imleç verileri getirdikten sonra başka bir kullanıcı tarafından yapılan değişiklikler artık imlece yansıtılmayacaktır.

Bir dizi tuşla kontrol edilen bir imleç, statik ve dinamik arasında özelliklere sahiptir. Kayıtlar örnekleme anında tanımlanır ve böylece değişiklikler takip edilir. Bu tür imleç, geriye doğru kaydırmayı uygularken kullanışlıdır. Bu durumda, bilgi güncellenene ve imleç seçimini yapana kadar veri ekleme ve silme işlemleri görünmez. Yeni sürüm değişiklik yapılıp yapılmadığını kaydeder.

Statik imleçler en iyi bilgi işleme sistemleri için kullanılır; raporlama sistemleri veya istatistiksel ve analitik amaçlar için. Statik bir imleç büyük miktarlarda veri getirmede daha iyidir. Nesnelerin (koltuklar, biletler) elektronik olarak satın alınmasına veya rezervasyon yapılmasına yönelik sistemlerde, değişiklik yapıldıkça güncellenen bilgilerin dinamik olarak algılanması gerekir. Bu gibi durumlarda dinamik bir imleç kullanılır. Bu uygulamalarda aktarılan veri miktarı genellikle küçüktür ve bireysel kayıt düzeyinde erişilir.

Sıralı imleçler, verilerin yalnızca imlecin başından sonuna kadar ters yönde getirilmesine izin vermez. Sıralı bir imleç, tüm veri satırlarının bir kümesini saklamaz. İmleçte seçim yapıldığı anda veritabanından okunurlar, bu da kullanıcıların INSERT, UPDATE, DELETE komutlarını kullanarak yaptığı tüm değişikliklerin veritabanına dinamik olarak yansıtılmasına olanak tanır. İmleç en son veri durumunu okur.

İmleç Bildirimi

SELECT_statement için imleç_adı imlecini bildirin ]]

Bir anahtar kelime kullanırken YEREL Yalnızca blok, tetikleyici, saklı yordam veya kullanıcı tanımlı işlev içinde görülebilen yerel bir imleç oluşturulacaktır. Anahtar kelime KÜRESEL, geçerli bağlantı kapatılıncaya kadar var olan genel bir imleci tanımlar.

Şebeke SADECE İLERİ Verilerin yalnızca ilk satırdan son satıra doğru alınmasına olanak tanıyan sıralı bir imleç tanımlar. Operatörü kullanırken TASLAK verilere herhangi bir sırayla ve herhangi bir yönde erişilmesine olanak tanıyan kaydırılabilir bir imleç oluşturulur.

İmleç türü operatörler tarafından belirlenir:

  • STATİK - statik bir imleç oluşturma;
  • DİNAMİK - dinamik bir imleç oluşturma;
  • KEYSET - bir tuş imleci oluşturma.

İmleç için ise SADECE OKU argümanı belirt İLERİ SAR, ardından oluşturulan imleç aşağıdakiler için optimize edilecektir: hızlı erişim verilere. Bu argüman argümanlarla birlikte kullanılamaz SADECE İLERİ Ve İYİMSER.

İmleç operatörle oluşturulmuşsa İYİMSER, bu durumda imleç açıldıktan sonra değiştirilen satırların değiştirilmesi veya silinmesi yasaktır.

Bir argüman belirtirken TYPE_WARNING sunucu, SELECT sorgusuyla uyumlu değilse, örtülü bir imleç türü değişikliğini rapor edecektir.

Bir imleçten veri alma, getirme

İmleci açtıktan hemen sonra aşağıdaki komutu kullanarak içeriğini alabilirsiniz:

Operatörü kullanırken BİRİNCİİmlecin sonuç kümesinin ilk satırı döndürülür ve bu satır geçerli satır olur. Belirtildiğinde SON imlecin son satırı döndürülecektir. Aynı zamanda geçerli satır olur.

Bir operatör belirtirken SONRAKİ sonuç kümesindeki mevcut satırdan hemen sonraki satır döndürülecektir. Bu satır geçerli satır olur. Varsayılan komut GİDİP GETİRMEK satırları getirmek için tam olarak bu yöntemi kullanır.

Bir operatör belirtirken ÖNCEKİ geçerli olandan önceki satır döndürülecektir. Bu satır geçerli satır olur.

Şebeke MUTLAK (satır_numarası | @satır_numarası_değişken)İmlecin tam sonuç kümesindeki bir satırı mutlak sıra numarasına göre döndürür. Satır numarası bir sabit kullanılarak veya satır numarasının saklandığı değişkenin adı olarak belirtilebilir. Değişken bir tamsayı veri türü olmalıdır. Hem pozitif hem de negatif değerler belirtilir. Pozitif bir değer belirtirken dize kümenin başından itibaren sayılır, negatif bir değer ise sondan itibaren sayılır. Seçilen satır geçerli satır olur. Boş bir değer belirtilirse hiçbir satır döndürülmez.

Argüman BAĞIL (satır sayısı | @değişken satır sayısı) Geçerli satırdan sonraki belirtilen satır sayısı kadar satır uzaklığını döndürür. Negatif sayıda satır belirtirseniz, geçerli satırdan önceki belirtilen sayıda satır döndürülür. Boş bir değerin belirtilmesi geçerli satırı döndürecektir. Döndürülen satır geçerli satır olur.

Genel bir imleci açmak için adından önce bir anahtar kelime belirtmeniz gerekir KÜRESEL. İmleç adı bir değişken kullanılarak da belirtilebilir.

İfadede INTO @değişken_adı [,...n] döndürülen satırın karşılık gelen sütun değerlerinin saklanacağı bir değişken listesi tanımlanır. Değişkenlerin sırası, imleçteki sütunların sırasıyla eşleşmelidir ve değişkenin veri türü, imleç sütunundaki veri türüyle eşleşmelidir.

İmleç kullanarak verileri değiştirme ve silme

İmleç kullanarak verileri değiştirmek için aşağıdaki formatta bir UPDATE komutu vermelisiniz:

Tek bir işlemle, geçerli imleç satırının birkaç sütununun değerleri değiştirilebilir, ancak bunların hepsinin aynı tabloya ait olması gerekir.

İmleç kullanarak verileri silmek için DELETE komutunu aşağıdaki formatta kullanın:

Sonuç olarak imleçteki mevcut satır silinecektir.

Belleği serbest bırakma, serbest bırakma

Bir imleci bellekten kaldırmak için şu komutu kullanın:

İmleç_adı'nın yerini ayırın;

@@FETCH_STATUS özelliği

İmleçteki satırların varlığını belirlemek için genel bir değişken kullanmalısınız. @@FETCH_STATUS, eğer imleçte başka satır yoksa sıfırdan farklı bir değer alır. Satır kümesi henüz tükenmemişse @@FETCH_STATUS sıfıra eşittir.

SQL sunucusundaki imleç örneği

@şirket varchar(50), @yönetici varchar(50), @message varchar(256); crs_clients imlecini seçilen şirket için yerel olarak bildir, müşterilerden yönetici burada şehir = "Moskova" şirkete göre sipariş, yönetici; "Müşteri listesi" yazdır; crs_clients'ı açın; sonrakini crs_clients'tan @company, @manager'a getir; @@FETCH_STATUS = 0 başlarken select @message = "Şirket " + @şirket + " yönetici " + @yönetici; @mesajı yazdır; -- crs_clients'tan @company, @manager'a bir sonraki kayıt getirme işlemine geçin; son; crs_clients'ı kapatın; crs_clients'ın yerini ayırın;

İmlecin tanımı verilmiştir. Türlerinin ve davranışlarının bir açıklaması verilmiştir: statik, dinamik, sıralı ve tuş imleçleri. İmleç kontrolünün ilkeleri açıklanmaktadır: imleç oluşturma ve açma, verileri okuma, imleci kapatma. İmleç programlama örnekleri verilmiştir.

İmleç konsepti

İlişkisel bir veritabanına yönelik bir sorgu genellikle birden fazla veri satırı (kayıt) döndürür, ancak uygulama aynı anda yalnızca bir kaydı işler. Aynı anda birkaç satırla ilgilense bile (örneğin, verileri elektronik tablo biçiminde görüntülemek), bunların sayısı hala sınırlıdır. Ayrıca verileri değiştirirken, silerken veya eklerken iş birimi seridir. Bu durumda imleç kavramı ön plana çıkmaktadır ve bu bağlamda imleç bir satırın işaretçisidir.

SQL'deki imleç, veritabanı belleğinde son SQL ifadesini tutmak için tasarlanmış bir alandır. Geçerli ifade bir veritabanı sorgusuysa, geçerli değer veya geçerli imleç satırı adı verilen bir sorgu verisi satırı da bellekte saklanır. Bellekte belirtilen alan adlandırılır ve uygulama programları tarafından erişilebilir.

Tipik olarak imleçler, bir veritabanından, içinde depolanan bilgilerin bir alt kümesini seçmek için kullanılır. Herhangi bir zamanda bir imleç satırı uygulama programı tarafından kontrol edilebilir. İmleçler sıklıkla kullanılır SQL ifadeleri, prosedürel dillerde yazılmış uygulama programlarına yerleşiktir. Bazıları dolaylı olarak veritabanı sunucusu tarafından oluşturulurken diğerleri programcılar tarafından tanımlanır.

SQL standardına uygun olarak, imleçlerle çalışırken aşağıdaki ana eylemler ayırt edilebilir:

  • yaratılış veya imleç bildirimi;
  • açılış imleci yani çok seviyeli hafızada saklanan verilerle doldurulması;
  • imleçten seçim ve onunla veri satırlarını değiştirmek;
  • imleci kapatma bundan sonra kullanıcı programları tarafından erişilemez hale gelir;
  • imleci serbest bırakma yani İmleci bir nesne olarak silmek, çünkü onu kapatmak, onunla ilişkili belleği mutlaka boşaltmaz.

İmlecin tanımı uygulamalara göre biraz farklılık gösterebilir. Örneğin, bazen bir geliştiricinin imleç için ayrılan belleği açıkça boşaltması gerekir. Sonrasında imleci serbest bırak ilişkili hafızası da serbest bırakılır. Bu, adının yeniden kullanılmasını mümkün kılar. Diğer uygulamalarda ne zaman imleci kapatma Belleğin serbest bırakılması örtülü olarak gerçekleşir. İyileşmenin hemen ardından diğer işlemler için kullanılabilir hale gelir: başka bir imleç açılıyor vesaire.

Bazı durumlarda imleç kullanmak kaçınılmazdır. Ancak mümkünse bundan kaçınılmalı ve standart veri işleme komutlarıyla çalışılmalıdır: SELECT, UPDATE, INSERT, DELETE. İmleçlerin tüm veri hacmi üzerinde değişiklik işlemlerine izin vermemesine ek olarak, imleç kullanılarak veri işleme işlemlerinin gerçekleştirilme hızı standart SQL araçlarına göre belirgin şekilde daha düşüktür.

İmleçlerin MS SQL Server ortamında uygulanması

SQL Server üç tür imleci destekler:

  • SQL imleçleri öncelikle tetikleyiciler, saklı yordamlar ve komut dosyaları içinde kullanılır;
  • sunucu imleçleri sunucu üzerinde çalışır ve ODBC, OLE DB, DB_Library için uygulama programlama arayüzünü uygular;
  • İstemci imleçleri istemcinin kendisinde uygulanır. Satırların tüm sonuç kümesini sunucudan alır ve yerel olarak saklarlar; bu, ağ operasyonlarında harcanan zaman kaybını azaltarak veri işlemeyi hızlandırır.

Farklı türdeki çok kullanıcılı uygulamalar, verilere farklı türde paralel erişim gerektirir. Bazı uygulamalar, veritabanındaki değişikliklerle ilgili bilgilere anında erişim gerektirir. Bu, bilet rezervasyon sistemleri için tipiktir. İstatistiksel raporlama sistemleri gibi diğer durumlarda veri istikrarı önemlidir çünkü sürekli olarak değiştiriliyorsa programlar bilgileri etkili bir şekilde görüntüleyemeyecektir. Farklı uygulamalar farklı imleç uygulamalarına ihtiyaç duyar.

SQL Server'da imleç türleri sağladıkları yeteneklere göre farklılık gösterir. İmleç türü, oluşturulma aşamasında belirlenir ve değiştirilemez. Bazı imleç türleri, diğer kullanıcıların sonuç kümesindeki satırlarda yaptığı değişiklikleri algılayabilir. Ancak, SQL Server yalnızca satıra erişilirken bu tür satırlarda yapılan değişiklikleri izler ve satır zaten okunduktan sonra değişikliklerin değiştirilmesine izin vermez.

İmleçler iki kategoriye ayrılır: ardışık ve kaydırılabilir. Ardışık Verileri baştan sona yalnızca tek bir yönde seçmenize olanak tanır. Kaydırılabilir imleçler daha fazla hareket özgürlüğü sağlar - her iki yönde de hareket etmek ve imlecin sonuç kümesinin isteğe bağlı bir satırına atlamak mümkündür.Program, imlecin işaret ettiği verileri değiştirebiliyorsa buna kaydırılabilir ve değiştirilebilir denir. İmleçlerden bahsetmişken, işlem izolasyonunu unutmamalıyız. Bir kullanıcı bir kaydı değiştirdiğinde, bir başkası bunu kendi imlecini kullanarak okur ve üstelik aynı kaydı değiştirebilir, bu da veri bütünlüğünün korunmasını gerekli kılar.

SQL Server statik, dinamik, ardışık ve bir dizi tuşla kontrol edilir.

Şemadaki statik imleç bilgiler veritabanından bir kez okunur ve anlık görüntü olarak saklanır (belirli bir zamanda), böylece başka bir kullanıcı tarafından veritabanında yapılan değişiklikler görünmez. Bir süre için imleci açma sunucu, tam sonuç kümesindeki tüm satırlara bir kilit ayarlar. Statik imleç oluşturulduktan sonra değişmez ve her zaman açıldığı sırada mevcut olan veri setini görüntüler.

Diğer kullanıcıların kaynak tablodaki imleçte yer alan verileri değiştirmesi durumunda, bu durum statik imleç.

İÇİNDE statik imleç Değişiklik yapmak mümkün olmadığından her zaman salt okunur modda açılır.

Dinamik imleç verileri "canlı" durumda tutar, ancak bunun için ağ ve yazılım kaynakları gerekir. Kullanma dinamik imleçler kaynak verinin tam bir kopyası oluşturulmaz ancak yalnızca kullanıcı belirli verilere eriştiğinde kaynak tablolardan dinamik seçim yapılır. Getirme sırasında sunucu satırları kilitler ve kullanıcının imlecin tam sonuç kümesinde yaptığı değişiklikler imleçte görünür. Ancak imleç veriyi getirdikten sonra başka bir kullanıcı değişiklik yaptıysa bunlar imlece yansımayacaktır.

İmleç bir dizi tuşla kontrol edilir, bu aşırı uçların ortasında yer almaktadır. Kayıtlar örnekleme anında tanımlanır ve böylece değişiklikler takip edilir. Bu tür imleç, geri kaydırmayı uygularken kullanışlıdır; daha sonra satır ekleme ve silme işlemleri, bilgiler güncellenene kadar görünmez ve sürücü, kayıtta değişiklik yapılmışsa kaydın yeni bir sürümünü seçer.

Sıralı imleçler ters yönde veri almasına izin verilmez. Kullanıcı yalnızca imlecin başından sonuna kadar olan satırları seçebilir. Seri imleç tüm satırlardan oluşan bir kümeyi saklamaz. İmleçte seçildikleri anda veritabanından okunurlar, bu da kullanıcıların veritabanında yaptığı tüm değişikliklerin INSERT, UPDATE, DELETE komutları kullanılarak dinamik olarak yansıtılmasına olanak tanır. İmleç verinin en son durumunu gösterir.

Statik imleçler Verilerin istikrarlı bir görünümünü sağlar. Bilgi "depolama" sistemleri için iyidirler: raporlama sistemlerine yönelik uygulamalar veya istatistiksel ve analitik amaçlar. Ayrıca, statik imleç Büyük miktarda veriyi örneklemekle diğerlerinden daha iyi başa çıkar. Bunun aksine, elektronik satın alma veya bilet rezervasyon sistemleri, değişiklikler yapıldıkça güncellenen bilgilerin dinamik olarak algılanmasını gerektirir. Bu gibi durumlarda kullanılır dinamik imleç. Bu uygulamalarda aktarılan veri miktarı genellikle küçüktür ve satır (bireysel kayıt) düzeyinde erişilir. Grup erişimi çok nadirdir.

MS SQL Server ortamında imleç yönetimi

İmleç kontrolü aşağıdaki komutları çalıştırarak uygulanır:

  • DECLARE - oluşturma veya imleç bildirimi;
  • AÇIK - açılış imleci yani onu verilerle doldurmak;
  • GİDİP GETİRMEK imleçten seçim ve imleci kullanarak veri satırlarını değiştirme;
  • KAPALI - imleci kapatma;
  • DAĞITIM – imleci serbest bırakma yani İmlecin bir nesne olarak silinmesi.

İmleç Bildirimi

SQL standardı, bir imleç oluşturmak için aşağıdaki komutu sağlar:

INSENSITIVE anahtar sözcüğünü kullanmak şunu yaratacaktır: statik imleç. Veri değişiklikleri izin verilmez, ayrıca diğer kullanıcılar tarafından yapılan değişiklikler görüntülenmez. INSENSITIVE anahtar sözcüğü eksikse, dinamik imleç.

SCROLL anahtar sözcüğünü belirttiğinizde, oluşturulan imleç herhangi bir yönde kaydırılarak herhangi bir seçim komutunu kullanmanıza olanak sağlanır. Bu argüman atlanırsa imleç şu şekilde olacaktır: tutarlı yani görüntülemesi baştan sona yalnızca tek yönde mümkün olacaktır.

SELECT ifadesi, imleç için elde edilen satır kümesini belirleyen SELECT isteğinin gövdesini belirtir.

FOR READ_ONLY belirtilmesi salt okunur bir imleç oluşturur ve verilerde herhangi bir değişiklik yapılmasına izin vermez. Statikten farklıdır, ancak ikincisi de verilerin değiştirilmesine izin vermez. Salt okunur imleç olarak bildirilebilir dinamik imleç Bu, başka bir kullanıcı tarafından yapılan değişikliklerin görüntülenmesine olanak tanır.

FOR UPDATE argümanına sahip bir imleç oluşturmak, imleçte işlem yapmanızı sağlar veri değişikliği belirtilen sütunlarda veya OF sütun_adı bağımsız değişkeninin yokluğunda tüm sütunlarda.

MS SQL Server ortamında imleç oluşturma komutu için aşağıdaki sözdizimi kabul edilir:

<создание_курсора>::= imleç_adı DECLARE SELECT_ifadesi İÇİN İMLEÇ ]]

LOCAL anahtar sözcüğünün kullanılması, yalnızca onu oluşturan paket, tetikleyici, saklı yordam veya kullanıcı tanımlı işlevin kapsamında görülebilen yerel bir imleç oluşturacaktır. Bir paket, tetikleyici, prosedür veya işlev sonlandırıldığında imleç dolaylı olarak yok edilir. İmlecin içeriğini onu oluşturan yapının dışına geçirmek için parametresine bir OUTPUT argümanı atamanız gerekir.

GLOBAL anahtar sözcüğü belirtilirse, genel bir imleç oluşturulur; mevcut bağlantı kapatılıncaya kadar varlığını sürdürür.

FORWARD_ONLY belirtilmesi şunu oluşturur: seri imleç; Veriler yalnızca ilk satırdan son satıra doğru örneklenebilir.

SCROLL'un belirtilmesi şunu oluşturur: kaydırılabilir imleç; Verilere herhangi bir sırayla ve herhangi bir yönde erişilebilir.

STATIC'in belirtilmesi şunu oluşturur: statik imleç.

KEYSET'in belirtilmesi bir anahtar imleci oluşturur.

DİNAMİK oluşturmanın belirtilmesi dinamik imleç.

READ_ONLY imleci için FAST_FORWARD bağımsız değişkenini belirtirseniz, oluşturulan imleç hızlı veri erişimi için optimize edilecektir. Bu bağımsız değişken, FORWARD_ONLY veya OPTIMISTIC bağımsız değişkenleriyle birlikte kullanılamaz.

OPTIMISTIC argümanıyla oluşturulan bir imleç, daha sonra değiştirilen satırların değiştirilmesini veya silinmesini önler. imleci açma.

TYPE_WARNING bağımsız değişkenini belirterek, sunucu, SELECT sorgusuyla uyumsuzsa, imleç türünde yapılan örtülü bir değişiklik konusunda kullanıcıyı bilgilendirecektir.

İmleci açma

İçin imleci açma ve imleci oluştururken belirtilen SELECT sorgusundan gelen verilerle doldurmak için aşağıdaki komutu kullanın:

Sonrasında imleci açmaÇıkışı çok seviyeli bellekte saklanan ilgili SELECT ifadesi yürütülür.

Bir imleçten veri alma

Hemen sonra imleci açma aşağıdaki komutu kullanarak içeriğini (ilgili sorgunun yürütülmesinin sonucu) seçebilirsiniz:

FIRST'ün belirtilmesi, imlecin tam sonuç kümesinin ilk satırını döndürecektir; bu, geçerli satır haline gelir.

LAST seçeneğinin belirtilmesi imlecin en son satırını döndürür. Aynı zamanda geçerli satır olur.

NEXT'in belirtilmesi, tam sonuç kümesinde geçerli olandan hemen sonraki satırı döndürür. Artık güncel hale geldi. Varsayılan olarak FETCH komutu satırları getirmek için bu yöntemi kullanır.

PRIOR anahtar sözcüğü geçerli olandan önceki satırı döndürür. Güncel hale gelir.

Argüman MUTLAK (satır_numarası | @satır_numarası_değişken) imlecin tam sonuç kümesindeki bir satırı mutlak sıra numarasına göre döndürür. Satır numarası bir sabit kullanılarak veya satır numarasının saklandığı değişkenin adı olarak belirtilebilir. Değişken bir tamsayı veri türü olmalıdır. Hem pozitif hem de negatif değerler belirtilir. Pozitif bir değer belirtirken dize kümenin başından itibaren sayılır, negatif bir değer ise sondan itibaren sayılır. Seçilen satır geçerli satır olur. Boş bir değer belirtilirse hiçbir satır döndürülmez.

Argüman BAĞIL (satır sayısı | @değişken satır sayısı) Geçerli satırdan sonraki belirtilen sayıda satır olan satırı döndürür. Negatif sayıda satır belirtirseniz, geçerli satırdan önceki belirtilen sayıda satır döndürülür. Boş bir değerin belirtilmesi geçerli satırı döndürecektir. Döndürülen satır geçerli satır olur.

İle genel imleci aç, GLOBAL anahtar sözcüğünü adından önce belirtmeniz gerekir. İmleç adı bir değişken kullanılarak da belirtilebilir.

Tasarımda INTO @değişken_adı [,...n] döndürülen satırın karşılık gelen sütun değerlerinin saklanacağı bir değişken listesi belirtilir. Değişkenleri belirtme sırası, imleçteki sütunların sırası ile eşleşmelidir ve değişkenin veri türü, imleç sütunundaki veri türüyle eşleşmelidir. INTO yapısı belirtilmezse, FETCH komutunun davranışı SELECT komutunun davranışına benzeyecektir - veriler ekranda görüntülenir.

Verileri değiştirme ve silme

İmleç kullanarak değişiklik yapmak için aşağıdaki formatta bir UPDATE komutu vermelisiniz:

Geçerli imleç satırının birkaç sütunu tek bir işlemle değiştirilebilir, ancak bunların hepsinin aynı tabloya ait olması gerekir.

İmleç kullanarak verileri silmek için DELETE komutunu aşağıdaki formatta kullanın:

Sonuç olarak imleçteki hat seti akımı silinecektir.

İmleci kapatma

Kapattıktan sonra imleç program kullanıcıları tarafından erişilemez hale gelir. Kapatıldığında, çalışması sırasında takılan tüm kilitler kaldırılır. Kapatma yalnızca açık imleçlere uygulanabilir. Kapalı ama değil serbest bırakılan imleç yeniden açılabilir. Açılmamış bir imlecin kapatılmasına izin verilmez.

İmleci serbest bırakın

İmleci kapatma kendisiyle ilişkili belleği mutlaka boşaltmaz. Bazı uygulamaların DEALLOCATE deyimini kullanarak açıkça yer tahsisini kaldırması gerekir. Sonrasında imleci serbest bırak Bellek de serbest bırakılır ve imleç adının yeniden kullanılması mümkün olur.

İmlecin sonuna ulaşılıp ulaşılmadığını kontrol etmek için şu fonksiyonun kullanılması tavsiye edilir: @@FETCH_STATUS

@@FETCH_STATUS işlevi şunu döndürür:

Getirme başarılıysa 0;

1, imlecin dışındaki bir satırı getirme girişimi nedeniyle getirme başarısız olursa;

2, silinmiş veya değiştirilmiş bir satıra erişme girişimi nedeniyle getirme başarısız olursa.

DECLARE @id_kl INT, @firm VARCHAR(50), @fam VARCHAR(50), @message VARCHAR(80), @nam VARCHAR(50), @d DATETIME, @p INT, @s INT SET @s=0 PRINT "Alışveriş listesi" klient_cursor İMLECİ YEREL SEÇİM İÇİN BİLDİR Müşteri Kodu, Şirket, Soyadı Müşteriden NEREDE Şehir = "Moskova" SİPARİŞ BY Şirket, Soyadı klient_cursor'DAN SONRAKİ klient_cursor'DAN GETİR @id_kl, @firm, @fam WHILE @@FETCH_STATUS =0 BEGIN SELECT @message="Müşteri "+@fam+ "Şirket "+ @firm PRINT @message SELECT @message="Ürün adı Satın alma tarihi Maliyet" YAZDIR @message DECLARE tovar_cursor SEÇİM İÇİN İMLEÇ Ürün.Adı, İşlem.Tarihi, Ürün .Fiyat* İşlem.Maliyet OLARAK Adedi Ürün ÜZERİNDEKİ ÜRÜN İÇ KATILMA İşleminden. Ürün Kodu=İşlem.Ürün Kodu NEREDE İşlem.Müşteri Kodu=@id_kl AÇ tovar_cursor tovar_cursor'DAN SONRAKİ ÜRÜNÜ @nam, @d, @p IF @@FETCH_STATUS'A GETİR<>0 YAZDIR "Satın alma yok" WHILE @@FETCH_STATUS=0 BAŞLA SELECT @message=" "+@nam+" "+ CAST(@d AS CHAR(12))+" "+ CAST(@p AS CHAR(6)) YAZDIR @message SET @s=@s+@p SONRAKİ ÜRÜNÜ tovar_cursor'DAN @nam, @d, @p END KAPAT tovar_cursor DEALLOCATE tovar_cursor SELECT @message="Toplam maliyet "+ CAST(@s AS CHAR(6)) YAZDIR @message -- sonraki istemciye geç-- klient_cursor'DAN SONRAKİ ÜRÜNÜ @id_kl, @firm, @fam'A GETİR SONRAKİ KAPAT klient_cursor klient_cursor'u DEALLOCATE Örnek 13.6. Müşteriler tarafından Moskova'dan satın alınan malların listesini ve bunların toplam maliyetini görüntülemek için imleç.

Örnek 13.7. Moskova'daki müşteriler için kaydırılabilir bir imleç geliştirin. Telefon numarası 1 ile başlıyorsa bu numaranın bulunduğu müşteriyi silin ve ilk imleç girişinde telefon numarasının ilk rakamını 4 ile değiştirin.

DECLARE @firm VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @message VARCHAR(80) PRINT "Müşteri listesi" DECLARE klient_cursor CURSOR GLOBAL SCROLL TUŞ SEÇİMİ İÇİN Firma, Soyadı, Telefon Müşteriden NEREDE Şehir ="Moskova" SİPARİŞ ŞİRKETİNE GÖRE, SOYADI GÜNCELLEME İÇİN AÇ klient_cursor SONRAKİ klient_cursor'DAN GETİR klient_cursor'DAN @firm, @fam, @tel WHILE @@FETCH_STATUS=0 BAŞLA SELECT @message="Client "+@fam+ " Company "+ @firm " Phone "+ @tel PRINT @message -- eğer telefon numarası 1 ile başlıyorsa, -- bu numarayı içeren client'ı silin IF @tel LIKE '1%' DELETE Client WHERE MEVCUT OF klient_cursor ELSE -- sonrakine geçin client klient_cursor'DAN SONRAKİ FROM'U @firm, @fam, @tel'E GETİR SON klient_cursor'DAN @firm, @fam, @tel'E MUTLAK 1'İ FETCH - ilk girişte, telefon numarasındaki ilk rakamı 4 GÜNCELLEME İstemci AYARI Telefon ile değiştirin ='4' + SAĞ(@ tel,LEN(@tel)-1)) klient_cursor'UN GÜNCELİĞİ NEREDE SELECT @message="Müşteri "+@fam+" Şirket "+ @firm "Telefon "+ @tel YAZDIR @message KAPAT klient_cursor DEALLOCATE client_cursor Örnek 13.7. Moskova'daki müşteriler için kaydırılabilir imleç.

Örnek 13.8. Kullanım prosedürün çıkış parametresi olarak imleç. Prosedür bir veri seti (bir ürün listesi) döndürür.

Prosedürün çağrılması ve çıktı imlecinden verilerin yazdırılması aşağıdaki şekilde gerçekleştirilir:

DECLARE @my_cur İMLEÇ DECLARE @n VARCHAR(20) EXEC my_proc @cur=@my_cur ÇIKTI FETCH NEXT FROM @my_cur INTO @n SELECT @n WHILE (@@FETCH_STATUS=0) BAŞLA FETCH NEXT FROM @my_cur INTO @n SELECT @n SON KAPAT @my_cur DEALLOCATE @my_cur




Tepe