internet pencereler Android

imleçler. DECLARE CURSOR komutu genel kuralları Transact sql imleçleri

T-SQL kodumda her zaman küme tabanlı işlemleri kullanırım. Bana bu tür işlemlerin SQL Server'ın işlemek için tasarlandığı ve seri işlemeden daha hızlı olması gerektiği söylendi. İmleçlerin var olduğunu biliyorum ama onları nasıl kullanacağımdan emin değilim. Bazı imleç örnekleri verebilir misiniz? İmleçlerin ne zaman kullanılacağı konusunda rehberlik edebilir misiniz? Microsoft'un bunları bir nedenden dolayı SQL Server'a dahil ettiğini varsayıyorum, bu nedenle verimli bir şekilde kullanılabilecekleri bir yere sahip olmaları gerekir.

çözüm

Bazı çevrelerde imleçler hiç kullanılmaz, bazılarında son çare olarak kullanılır ve diğer gruplarda düzenli olarak kullanılır. Bu kampların her birinde imleç üzerinde durmalarının farklı nedenleri vardır. belirli durumlarda bir yeri var, başkalarında değil. Bu nedenle, imleç tabanlı işlemenin uygun olup olmadığına karar vermek için kodlama tekniğini anlamanıza, ardından eldeki sorunu anlamanıza bağlı. aşağıdakileri yapın:

  • Örnek bir imlece bakın
  • İmlecin bileşenlerini parçalayın
  • Ek imleç örnekleri sağlayın
  • İmleç kullanımının artılarını ve eksilerini analiz edin

SQL Server İmleci Nasıl Oluşturulur

SQL Server imleci oluşturmak tutarlı bir işlemdir, bu nedenle adımları öğrendikten sonra, veriler arasında döngü yapmak için bunları çeşitli mantık kümeleriyle kolayca çoğaltabilirsiniz. Adımlardan geçelim:

  1. İlk olarak, mantıkta ihtiyacınız olan değişkenlerinizi bildirirsiniz.
  2. İkincisi, mantık boyunca kullanacağınız belirli bir adla imleci bildirirsiniz. Bunu hemen imleci açarak takip eder.
  3. Üçüncüsü, veri işlemeye başlamak için imleçten bir kayıt alırsınız.
  4. Dördüncüsü, her bir mantık kümesine özgü olan veri sürecidir. Bu, ekleme, güncelleme, silme vb. olabilir. getirilen her veri satırı için. Her satırda gerçekleştirilen bu işlem sırasındaki en önemli mantık seti budur.
  5. Beşinci olarak, 3. adımda yaptığınız gibi imleçten bir sonraki kaydı getirirsiniz ve ardından seçilen veriler işlenerek 4. adım tekrarlanır.
  6. Altıncısı, tüm veriler işlendikten sonra imleci kapatırsınız.
  7. Son ve önemli bir adım olarak, SQL Server'ın tuttuğu tüm dahili kaynakları serbest bırakmak için imleci serbest bırakmanız gerekir.

Buradan, SQL Server imleçlerinin ne zaman kullanılacağını ve nasıl yapılacağını öğrenmeye başlamak için aşağıdaki örneklere göz atın.

Örnek SQL Server İmleci

İşte, yedeklemelerin seri bir şekilde verildiği tüm SQL Server veritabanlarını yedeklemek için Basit komut dosyasından bir örnek imleç:

DECLARE @name VARCHAR(50) -- veritabanı adı DECLARE @path VARCHAR(256) -- yedekleme dosyaları için yol DECLARE @fileName VARCHAR(256) -- yedekleme için dosya adı DECLARE @fileDate VARCHAR(20) -- dosya adı SET için kullanılır @path = "C:\Backup\" SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) MASTER.dbo.sysdatabases FROM AD SEÇİMİ İÇİN İMLEÇ BİLDİRİM WHERE NOT IN ("master", model ","msdb","tempdb") OPEN db_cursor FETCH FROM FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BAŞLA @fileName = @path + @name + "_" + @fileDate + ".BAK" BACKUP DATABASE @ name TO DISK = @fileName SONRAKİ db_cursor'DAN @name END KAPAT db_cursor DEALLOCATE db_cursor

SQL Server İmleç Bileşenleri

Yukarıdaki örneğe göre, imleçler şu bileşenleri içerir:

  • DECLARE deyimleri - Kod bloğunda kullanılan değişkenleri bildirir
  • SET\SELECT deyimleri - Değişkenleri belirli bir değere sıfırla
  • DECLARE CURSOR deyimi - İmleci değerlendirilecek değerlerle doldurun
    • NOT - DECLARE CURSOR FOR deyiminde SELECT deyiminde olduğu gibi eşit sayıda değişken vardır. Bu, 1 veya birçok değişken ve ilişkili sütun olabilir.
  • OPEN ifadesi - Veri işlemeye başlamak için imleci açın
  • FETCH NEXT ifadeleri - İmleçten değişkenlere belirli değerleri atayın
    • NOT - Bu mantık, WHILE deyiminden önceki ilk popülasyon için ve daha sonra WHILE ifadesinin bir parçası olarak süreçteki her döngü sırasında tekrar kullanılır.
  • WHILE ifadesi - Veri işlemeye başlama ve devam etme koşulu
  • BEGIN...END ifadesi - Kod bloğunun başlangıcı ve sonu
    • NOT - Veri işlemeye dayalı olarak birden fazla BEGIN...END ifadesi kullanılabilir
  • Veri işleme - Bu örnekte, bu mantık bir veritabanını belirli bir yola ve dosya adına yedeklemek içindir, ancak bu herhangi bir DML veya yönetim mantığı ile ilgili olabilir.
  • CLOSE deyimi - Geçerli verileri ve ilgili kilitleri serbest bırakır, ancak imlecin yeniden açılmasına izin verir
  • DEALLOCATE ifadesi - İmleci yok eder

Önerilen Kaynaklar

SQL Server İmleçleri ve alternatifleri hakkında daha fazla bilgi edinin:

Ek SQL Server İmleç Örnekleri

Yukarıdaki örnekte, yedeklemeler bir imleç aracılığıyla verilir, imleç tabanlı mantıktan yararlanan şu diğer ipuçlarına göz atın:

  • SQL Server'da Yabancı Anahtar kısıtlamalarını devre dışı bırakmak, etkinleştirmek, bırakmak ve yeniden oluşturmak için komutlar oluşturmak için komut dosyası

SQL Server İmleç Analizi

Aşağıdaki analiz, imleç tabanlı mantığın faydalı olabileceği veya olmayabileceği çeşitli senaryolar hakkında bilgi sağlamayı amaçlamaktadır:

  • Çevrimiçi İşlem İşleme (OLTP) - Çoğu OLTP ortamında, SET tabanlı mantık kısa işlemler için en mantıklı olanıdır. Ekibimiz, tüm işlemleri için imleçleri kullanan ve sorunlara neden olan bir üçüncü taraf uygulamasıyla karşılaştı, ancak bu nadir görülen bir durumdu. Tipik olarak, SET tabanlı mantık mümkün olandan daha fazladır ve imleçlere nadiren ihtiyaç duyulur.
  • Raporlama - Raporların tasarımına ve temeldeki tasarıma bağlı olarak, imleçlere genellikle ihtiyaç duyulmaz. Ancak, ekibimiz, temel alınan veritabanında referans bütünlüğünün bulunmadığı ve raporlama değerlerini doğru bir şekilde hesaplamak için bir imleç kullanılmasının gerekli olduğu raporlama gereksinimleriyle karşılaşmıştır. Aşağı akış süreçleri için veri toplamaya ihtiyaç duyduğumuzda aynı deneyimi yaşadık, imleç tabanlı bir yaklaşımın geliştirilmesi hızlıydı ve ihtiyacı karşılamak için kabul edilebilir bir şekilde uygulandı.
  • Serileştirilmiş işleme - Bir işlemi serileştirilmiş bir şekilde tamamlamanız gerekiyorsa, imleçler uygun bir seçenektir.
  • İdari görevler - Birçok idari görevin, imleç tabanlı mantığa güzel bir şekilde uyan seri bir şekilde yürütülmesi gerekir, ancak ihtiyacı karşılamak için başka sistem tabanlı nesneler de mevcuttur. Bu koşulların bazılarında, işlemi tamamlamak için imleçler kullanılır.
  • Büyük veri kümeleri - Büyük veri kümeleriyle aşağıdakilerden herhangi biriyle veya birkaçıyla karşılaşabilirsiniz:
    • İmleç tabanlı mantık, işleme ihtiyaçlarını karşılayacak şekilde ölçeklenmeyebilir.
    • Minimum miktarda belleğe sahip sunucularda büyük küme tabanlı işlemlerle, veriler disk belleğine alınabilir veya SQL Server'ı tekelleştirebilir, bu da zaman alıcıdır ve çekişme ve bellek sorunlarına neden olabilir. Bu nedenle, imleç tabanlı bir yaklaşım ihtiyacı karşılayabilir.
    • Bazı araçlar, verileri doğal olarak kapakların altındaki bir dosyaya önbelleğe alır, bu nedenle verilerin bellekte işlenmesi gerçekte böyle olabilir veya olmayabilir.
    • Veriler, aşamalı bir SQL Server veritabanında işlenebiliyorsa, üretim ortamı üzerindeki etkiler yalnızca son veriler işlendiğinde olur. Hazırlama sunucusundaki tüm kaynaklar ETL işlemleri için kullanılabilir, ardından nihai veriler alınabilir.
    • SSIS, büyük bir veri kümesini daha yönetilebilir boyutlara ayırmaya yönelik genel ihtiyacı çözebilecek ve bir imleçle satır satır yaklaşımdan daha iyi performans gösterebilecek toplu veri kümelerini destekler.
    • İmleç veya SSIS mantığının nasıl kodlandığına bağlı olarak, bir
    • GO komutuyla bir toplu işi tekrarlayın
    Sonraki adımlar
    • Bir veri işleme kararı ile karşı karşıya kaldığınızda, SQL Server imleç kullanımı ile nerede olduğunuzu belirleyin. Uygulamanızda veya operasyonel süreçlerinizde yeri olabilir veya olmayabilir. Bir görevi tamamlamanın birçok yolu vardır, bu nedenle imleç kullanmak makul bir alternatif olabilir veya olmayabilir. Sen yargıç ol.
    • Başka bir kodlama tekniğiyle ilgili sorunlarla karşılaşırsanız ve hızlı bir şekilde bir şeyler yapmanız gerekiyorsa, imleç kullanmak uygun bir alternatif olabilir. Verilerin işlenmesi daha uzun sürebilir, ancak kodlama süresi çok daha kısa olabilir. Tek seferlik bir işleminiz veya her gece işleminiz varsa, bu işe yarayabilir.
    • Ortamınızda imleçlerden kaçınılırsa, uygun başka bir alternatif seçtiğinizden emin olun. İşlemin başka sorunlara neden olmayacağından emin olun. Örnek olarak, bir imleç kullanılırsa ve milyonlarca satır işlenirse, bu potansiyel olarak tüm verileri önbellekten temizler ve daha fazla çekişmeye neden olur mu? Veya büyük bir veri seti ile veriler diske çağrılacak mı yoksa geçici bir dizine mi yazılacak?
    • İmleç tabanlı bir yaklaşımı diğer alternatiflere karşı değerlendirirken, tekniklerin zaman, çekişme ve ihtiyaç duyulan kaynaklar açısından adil bir karşılaştırmasını yapın. Umarım bu faktörler sizi doğru tekniğe yönlendirir.

Basit bir müşteri isteğine yanıtın, çoğu müşteri için sindirilemeyen yüz binlerce satırdan oluşan bir seçim olması iyi olabilir. Bu durumda, istemcilerle etkileşim sorununun çözümü, sunucu ve istemci arasında veri alışverişi için evrensel bir mekanizma olarak imleçlerin kullanılmasıdır. İmleçler, ortaya çıkan veri seti (sorgu yürütmenin sonucu) ile çalışarak kullanıcılara veri işleme için ek seçenekler sunar:

İmleçler, veri kümesindeki seri numaralarını belirterek tablo satırlarıyla çalışmanıza olanak tanır;

İmleçler, örneğin bir sütunun değerini değiştirirken diğer sütunların değerlerine tekrar tekrar erişmeyi gerektirdiğinde, karmaşık veri değiştirme işlemlerini gerçekleştirmenize izin verir.

İmleç yaşam döngüsü:

İmleç oluşturma: BİLDİRMEK<имя курсора>[DUYARSIZ] [KAYDIRMA] İMLEÇ İÇİN< SELECT -оператор>İÇİN (SADECE OKUYUN | GÜNCELLEME)

Burada, INSENSITIVE anahtar sözcüğü, imlecin statik olacağı (verinin anlık görüntüsü), varsayılan olarak imlecin dinamik oluşturulduğu anlamına gelir (seçim, satıra her erişildiğinde yapılır). SCROLL anahtar sözcüğü, imlecin herhangi bir yönde kaydırılabileceği anlamına gelir, aksi takdirde imleç "sıralı" oluşturulur.

İmleç açılışı: AÇIK[KÜRESEL]<имя курсора>. GLOBAL olarak belirtilen bir imleç, çağrıldığı prosedür veya paket sona erdiğinde otomatik olarak silinmez.

Okumaveri : FETCH [[ SONRAKİ | ÖNCE | İLK | son | MUTLAK n | İLİŞKİ n ] FROM ] [ KÜRESEL ]<имя курсора>[ INTO @ değişken _ adı , …]. SQL Server 2000, bir imleçten yalnızca bir satırın okunmasına izin verir. FIRST anahtar sözcüğü, imlecin ilk satırını döndürmektir; LAST - imlecin son satırı; SONRAKİ - mevcut satırdan sonraki satır, döndürülen satır geçerli satır olur; ÖNCEKİ - mevcut olandan önceki; MUTLAK n - imleçteki mutlak seri numarasına göre bir dize döndürür; RELATIVE - geçerli satırdan sonra n satır. Sütun verileri, belirtilen değişkenlerin her birinde listelendikleri sırayla saklanacaktır.

Veri değişikliği: imleçlerle çalışmak üzere tasarlanmış sözdizimi ile bir GÜNCELLEME komutu yürütür.

Verilerin silinmesi: imleçlerle çalışmak üzere tasarlanmış sözdizimi ile bir DELETE komutu yürütür.

imleç kapat: KAPAT[KÜRESEL]<имя курсора>

İmleci serbest bırakmak: DEALLOCATE [ KÜRESEL ]<имя курсора>

İmleç örneği:

DECLARE fo_curs İMLEÇ STATİK İÇİN

ORDER BY name_eng'den name_eng'i SEÇİN

DECLARE @name varchar(50)

İLK ÖNCE fo_curs'DAN @name İÇİ GETİRİN

WHILE @@FETCH_STATUS=0

SONRAKİ fo_curs INTO @name

DEALLOCATE fo_curs

2.7. Microsoft SQL Server'da veri güvenliğini ve bütünlüğünü sağlamak. Veritabanı Yönetimi. Roller. Kullanıcılara haklar atama (GRANT, DENY, REVOKE). SQL Server'da veri koruma yöntemleri ve teknolojileri.

SQL Server Güvenliği ve Yönetimi. .

VTYS'nin ana görevi, seçilen konu alanı içindeki verilerin bütünlüğünü ve tutarlılığını sağlamaktır. Sistemin bu sorunu çözmesini engelleyen faktörlerden biri de, yanlışlıkla veya kasıtlı olarak veri yapısını bozmaya veya verinin kendisini değiştirmeye çalışan kullanıcıların eylemleridir. Bu nedenle, DBMS sadece fiziksel arızalardan değil, aynı zamanda uygulanan görevler için yetersiz olan kullanıcılardan da korunmalıdır. Bunun için kullanıcıların yetkilerini aşan eylemler gerçekleştirmelerini engelleyecek bir güvenlik sistemi tasarlamak ve veritabanına bağlamak gerekir.

Veritabanı Yönetimi

TSQL kullanarak bir veritabanı oluşturmak için CREATE DATABASE komutu kullanılır, ancak bu amaçla genellikle SQL Server Management Studio kullanılır. SQL Server'da tanımlanmış birkaç veritabanı işlemi vardır: dosya boyutlarını artırma (azaltma), yapılandırmayı değiştirme (ALTER komutu), ekleme ve ayırma, sahipliği aktarma, adı değiştirme, özellikleri görüntüleme ve son olarak silme (DROP DATABASE).

Çoğu veritabanı sunucusunda olduğu gibi, SQL Server'da da tam yönetici ayrıcalıklarına sahip bir kullanıcı vardır - bu Sistem Yöneticisi veya "sa". İlk sunucu kurulumundan sonra sa parolası boştur. Yeni bir veritabanı oluşturan kullanıcı otomatik olarak onun sahibi olur ('dbo" - Veri Tabanı Sahibi). Veritabanı oluşturulurken "misafir" kullanıcı da tanımlanır. Kullanıcı hesabı açıkça belirli bir veritabanı kullanıcısıyla eşlenmemişse , kullanıcıya misafir adını kullanarak örtülü erişim verilir. Misafir genellikle yasaktır.

Veritabanında nesneyi oluşturan kullanıcı otomatik olarak nesnenin sahibi olur ve dbo ve sa dahil hiç kimse, sahibi kendisine haklar verene kadar nesneyi kullanamaz. Ancak kullanıcının bir nesne oluşturabilmesi için önce veritabanı sahibinin ona uygun hakları vermesi gerekir.

rol yönetimi basitleştirmek için aynı işlevleri gerçekleştiren kullanıcıları birleştirmenize olanak tanır. Roller yerleşik ve özeldir. Yerleşik roller, sunucu düzeyinde ve veritabanı düzeyinde uygulanır. Aşağıda bir veritabanı için yerleşik roller tablosu verilmiştir:

db_sahibi. Veritabanındaki tüm haklara sahiptir

db_accessadmin. Kullanıcı ekleyebilir veya kaldırabilir

db_securityadmin. Tüm izinleri, nesneleri, rolleri ve kullanıcıları yönetir

db_ddladmin. GRANT, DENY, REVOKE dışındaki tüm DDL komutlarını çalıştırabilir

db_backupoperator. Arşivleme komutlarını yürütebilir. veri

db_datareader. Görüntüleyebilir. herhangi bir tablodaki herhangi bir veri

db_datawriter. Belki bir modifikasyon. herhangi bir tablodaki herhangi bir veri

db_denydatareader. yasak görüş Aşk herhangi bir veri tablolar

db_denydatawriter. Herhangi bir tablodaki herhangi bir veriyi değiştirmeyi yasakla

Kullanıcılara haklar atayın. SQL Server güvenliğinin temeli (1) hesaplardır; (2) kullanıcılar (kullanıcılar); (3) roller; (4) gruplar.

Bir kullanıcı SQL Server'a bağlandığında, gerçekleştirebilecekleri eylemler, kendisine kullanıcı ve bir rolün üyesi olarak verilen haklara göre belirlenir. Haklar, DBMS yöneticisi, veritabanının sahibi veya belirli bir veritabanı nesnesinin sahibi tarafından verilir. Veritabanı hakları üç kategoriye ayrılabilir: (1) veritabanı nesnelerine erişim hakları; (2) TSQL komutlarını yürütme hakları; (3) zımni haklar. Sunucu, sahipliği bir kullanıcıdan diğerine aktarmanıza olanak tanır.

Veritabanı nesnelerine erişmek için kullanıcı izinlerini yönetmek için aşağıdaki komutlar kullanılır:

HİBE( TÜMÜ |< вид действия >,…}

( ÜZERİNDE (<имя таблицы или представления>} [(<имя столбца>,…)]

| ÜZERİNDE (< имя хранимой процедуры >}

| ÜZERİNDE (< имя пользовательской функции >}

TO ( KAMU |<имя объекта системы безопасности>,…}

[ OLARAK<имя группы> | <имя роли>]

kullanıcılara haklar atamak, nerede

TÜMÜ - kullanıcıya tüm olası izinler verilir, aksi takdirde belirtin

<вид действия>- kullanıcıya sunulan eylemlere ilişkin haklar, yani:

SEÇ - görüntülemek için, bir tablo sütunu için ve bir tablo için (görünüm)

INSERT - bir bütün olarak tablo (görünüm) için eklemek için

GÜNCELLEME - değişiklik, tablo sütunu ve tablo için (görünüm)

DELETE - silmek için, bir bütün olarak tablo (görünüm) için

EXECUTE - saklı yordamları yürütmek için

REFERANSLAR - belirtilen nesneye başvurma yeteneği (yabancı anahtara dahil edilecek).

<имя объекта системы безопасности>– SQL Server hesapları, Windows etki alanı kullanıcıları; KAMU - tüm kullanıcılar için.

HİBE SEÇENEĞİ İLE - Şu anda verilen kullanıcının, diğer kullanıcılara nesneye erişim hakları atamasına izin verir.

OLARAK<имя группы> | <имя роли>- bir kullanıcının, diğer kullanıcılara haklar verme fırsatı verilen bir role katılımı.

Yazarlara SEÇİM VERİN

Yazarları Mary, John, Tom'a EKLE, GÜNCELLEME, SİLME

HİBE SEÇENEĞİ İLE Muhasebeye Plan_Data ON SEÇİMİ HİBE

Jack AS Accounting'e Plan_Data SEÇİMİ VERİN

Jack Muhasebe rolünde değil, ancak bu roldeki biri hakkı verebilir

REDDETMEK( TÜMÜ |< вид действия >,…}

( ÜZERİNDE (<имя таблицы или представления>} [(<имя столбца>,…)]

| ÜZERİNDE (<имя хранимой процедуры>}

| ÜZERİNDE (<имя пользовательской функции>}

TO ( KAMU |<имя объекта системы безопасности>,…}

erişim reddedildi kullanıcıları veritabanı nesnelerine CASCADE sadece bu kullanıcının değil, hak verdiği herkesin haklarını geri alır.

Örnek (üzerinde komut yürütmeyi devre dışı bırak TSQL):

REDDET, Jack CASCADE İÇİN TABLO OLUŞTUR

Emretmek GERİ ÇEKMEK veritabanı nesnelerine erişimi dolaylı olarak reddetmek için kullanılır. Sözdizimi DENY komutuyla aynıdır. Örtülü reddetme, yalnızca tanımlandığı düzeyde etkili olması farkıyla erişimi reddetmeye benzer. Örnek: GoodUsers rolünün bir üyesi olan Jack kullanıcısına XFiles tablosuna erişim izni verildi. GoodUsers rolü, REVOKE ile bu tabloya erişimi reddederse, Jack kullanıcısı, hakları açıkça tanımlandığından bu tabloya erişmeye devam edebilir. Ona kişisel olarak REVOKE uygularsanız, XFiles'a erişim hakkını kaybeder.

Rollere verilen izinler, üyeleri tarafından devralınır. Bir kullanıcıya bir role üyelik yoluyla bir nesneye erişim izni verilir, ancak diğerinde reddedilirse, erişim çakışması her zaman bir reddetme lehine çözülür.

MS SQL Server'da veri koruma teknolojileri

1. Mekanizma kontrol noktaları– güncellenmiş sayfaları diske yazmak için ~60 s sonra oluşturulan kontrol noktaları (kontrol noktası, CHECKPOINT komutu tarafından zorlanabilir).

2. Veritabanının bütünlüğünü kontrol etmek için yerleşik ve harici mekanizmalar (otomatik olarak başlatılır veya DBCC yardımcı programı gibi - Veritabanı Tutarlılık Denetleyicisi - manuel olarak).

3. İşletim sistemi (yansıtılmış sabit disklerin mekanizması dahil) aracılığıyla veritabanı dosyalarının fiziksel olarak çoğaltılması (izin verilirse).

4. Veritabanlarını ve işlem günlüklerini yedekleme - bir yedekleme aygıtına (manyetik bant veya sabit disk) bir veritabanı dökümü yazarak.

5. Çoğaltma - bir SQL sunucusundan diğerine periyodik (bazı durumlarda - eşzamanlı) aktarımı yoluyla bilgileri çoğaltma olasılığı.

6. İstemci ve sunucu arasındaki trafiğin şifrelenmesi ve ayrıca veritabanı nesneleriyle çalışmak için kullanılan kodların şifrelenmesi (depolanmış prosedürler, tetikleyiciler vb.)

İmleç tanımlanır. Türlerinin ve davranışlarının bir açıklaması verilmiştir: statik, dinamik, sıralı ve anahtar imleçler. İmleç kontrolünün ilkeleri açıklanmıştır: imleç oluşturma ve açma, veri okuma, imleci kapatma. İmleç programlama örnekleri verilmiştir.

İmleç Konsepti

İlişkisel bir veritabanı sorgusu tipik olarak birden çok 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, elektronik tablolar biçiminde veri çıktısı), bunların sayısı hala sınırlıdır. Ayrıca, verileri değiştirirken, silerken veya eklerken iş birimi satırdır. Bu durumda imleç kavramı ön plana çıkar ve bu bağlamda imleç bir satırın işaretçisidir.

SQL'de bir imleç, veritabanı belleğinde son SQL ifadesini depolamaya ayrılmış bir bölgedir. Geçerli ifade bir veritabanı sorgusuysa, geçerli değer veya geçerli imleç satırı olarak adlandırılan sorgu veri dizisi de bellekte saklanır. Bellekte belirtilen alan adlandırılır ve uygulama programları tarafından kullanılabilir.

Tipik olarak, imleçler, bir veritabanında depolanan bilgilerin bir alt kümesini seçmek için kullanılır. Uygulama tarafından bir defada bir imleç satırı kontrol edilebilir. İmleçler genellikle prosedürel dillerde yazılmış uygulama programlarına gömülü SQL ifadelerinde kullanılır. Bazıları örtük olarak veritabanı sunucusu tarafından oluşturulur, diğerleri ise programcılar tarafından tanımlanır.

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

  • yaratılış veya imleç bildirimi;
  • imleç açma, yani çok seviyeli bellekte saklanan verilerle doldurma;
  • imleçten getir ve onunla veri satırlarını değiştirmek;
  • imleç kapat, bundan sonra kullanıcı programlarına erişilemez hale gelir;
  • imleci serbest bırakmak, yani imleci bir nesne olarak silmek, kapatmak, onunla ilişkili belleği mutlaka serbest bırakmaz.

Farklı uygulamalarda, imlecin tanımı bazı farklılıklar gösterebilir. Bu nedenle, örneğin, bazen geliştirici, imleç için ayrılan belleği açıkça serbest bırakmalıdır. Sonrasında imleci serbest bırakmak bununla ilişkili bellek de serbest bırakılır. Bu, adının yeniden kullanılmasını mümkün kılar. Diğer uygulamalarda, imleç kapat bellek örtük olarak serbest bırakılır. Kurtarma işleminden hemen sonra diğer işlemler için kullanılabilir hale gelir: başka bir imleç açma vb.

Bazı durumlarda, imleç kullanımı 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 miktarı üzerinde değişiklik işlemleri gerçekleştirmenize izin vermemesine ek olarak, imleç kullanarak veri işleme işlemlerini gerçekleştirme hızı, standart SQL araçlarından belirgin şekilde daha düşüktür.

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

SQL Server üç tür imleci destekler:

  • SQL imleçleri çoğunlukla 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 arabirimini uygular;
  • istemci imleçleri istemcinin kendisinde uygulanır. Tüm sonuç satırlarını sunucudan alır ve yerel olarak saklarlar, bu da ağ operasyonlarının israfını azaltarak veri işleme operasyonlarını hızlandırır.

Farklı türde çok kullanıcılı uygulamalar, farklı türde paralel veri erişimi gerektirir. Bazı uygulamaların, veritabanındaki değişikliklerle ilgili bilgilere anında erişmesi gerekir. Bu, bilet rezervasyon sistemleri için tipiktir. Diğer durumlarda, örneğin istatistiksel raporlama sistemlerinde, verilerin kararlılığı önemlidir, çünkü sürekli olarak değiştirilirlerse programlar bilgileri etkin bir şekilde görüntüleyemeyecektir. Farklı uygulamalar, farklı imleç uygulamalarına ihtiyaç duyar.

SQL Server ortamında, imleç türleri sağladıkları yetenekler açısından 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 tarafından sonuç kümesine dahil edilen satırlarda yapılan değişiklikleri algılayabilir. Ancak SQL Server, bu tür satırlardaki değişiklikleri yalnızca satıra erişim aşamasında 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 yalnızca bir yönde seçmenize izin verir - baştan sona. Kaydırılabilir İmleçler daha fazla hareket özgürlüğü sağlar - her iki yönde de hareket edebilir ve imlecin sonuç kümesinin herhangi bir satırına atlayabilirsiniz.Program imlecin gösterdiği verileri değiştirebiliyorsa, buna kaydırılabilir ve değiştirilebilir denir. İmleçlerden bahsetmişken, işlemlerin izolasyonu unutulmamalıdır. Bir kullanıcı bir kaydı değiştirdiğinde, diğeri onu kendi imleci ile okur ve ayrıca aynı kaydı değiştirebilir, bu da veri bütünlüğünü korumayı gerekli kılar.

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

ile şemada statik imleç bilgi veri tabanından bir kez okunur ve anlık görüntü olarak saklanır (belirli bir zaman noktasından itibaren), bu nedenle başka bir kullanıcı tarafından veri tabanında yapılan değişiklikler görünmez. Bir süre için imleç açma sunucu, tam sonuç kümesinde bulunan tüm satırlarda bir kilit alır. statik imleç oluşturulduktan sonra değişmez ve her zaman açılış anında var olan veri kümesini görüntüler.

Diğer kullanıcılar kaynak tablodaki imleçte bulunan verileri değiştirirse, bu durum tabloyu etkilemez. statik imleç.

İÇİNDE statik imleç Değişiklik yapamazsınız, bu nedenle her zaman salt okunur modda açılır.

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

Bir dizi tuş tarafından kontrol edilen imleç, bu aşırı uçların ortasında yer alır. Kayıtlar, numune alma anında tanımlanır ve bu sayede değişiklikler izlenir. Bu tür imleç, bilgiler güncellenene kadar satır eklemeleri ve silmelerin görünmemesi ve sürücüde değişiklik yapılmışsa girişin yeni bir sürümünü seçmesi için geri kaydırma uygulamak için kullanışlıdır.

sıralı imleçler ters yönde veri alınmasına izin vermeyin. Kullanıcı yalnızca imlecin başından sonuna kadar olan satırları seçebilir. sıralı imleç tüm satırların bir kümesini saklamaz. İmleçte seçildikleri anda veritabanından okunurlar, bu da INSERT , UPDATE , DELETE komutlarını kullanarak kullanıcılar tarafından yapılan tüm değişiklikleri dinamik olarak veritabanına yansıtmanızı sağlar. İmleç, verilerin en son durumunu gösterir.

Statik imleçler verilerin istikrarlı bir görünümünü sağlar. Bilgi "depo" sistemleri için iyidirler: raporlama sistemleri veya istatistiksel ve analitik amaçlar için uygulamalar. Ayrıca, statik imleç diğerlerinden daha iyi, büyük miktarda veri örnekleme ile başa çıkıyor. Aksine, elektronik satın alma veya bilet rezervasyonu sistemlerinde, değişiklikler yapıldıkça güncellenen bilgileri dinamik olarak algılamak gerekir. Bu gibi durumlarda, kullanın dinamik imleç. Bu uygulamalarda aktarılan veri miktarı genellikle küçüktür ve bunlara erişim satırlar (bireysel kayıtlar) düzeyinde gerçekleştirilir. Grup erişimi çok nadirdir.

MS SQL Server ortamında imleç kontrolü

imleç kontrolü aşağıdaki komutlar yürütülerek uygulanır:

  • DECLARE - oluştur veya imleç bildirimi;
  • AÇIK- imleç açma, yani verilerle doldurmak;
  • GİDİP GETİRMEK- imleçten getir ve bir imleç ile veri satırlarının değiştirilmesi;
  • KAPAT- imleç kapat;
  • DEALLOCATE- imleci serbest bırakmak, yani imleci bir nesne olarak silme.

imleç beyanı

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

INSENSITIVE anahtar sözcüğünü kullanmak, 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üğü yoksa, bir dinamik imleç.

SCROLL anahtar sözcüğünü belirterek, oluşturulan imleç herhangi bir yöne kaydırılabilir ve herhangi bir seçim komutunun uygulanmasına izin verilir. Bu argüman atlanırsa, imleç tutarlı, yani görüntülemesi yalnızca bir yönde mümkün olacaktır - baştan sona.

SELECT ifadesi, imleç satırlarının sonuç kümesini belirlemek için kullanılan SELECT sorgusunun gövdesini belirtir.

FOR READ_ONLY bağımsız değişkeninin 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 bir imleç olarak bildirilebilir dinamik imleç, başka bir kullanıcı tarafından yapılan değişiklikleri gösterecek.

FOR UPDATE argümanıyla bir imleç oluşturmak, imleç içinde çalıştırmanıza izin verir veri değişikliği ya belirtilen sütunlarda ya da tüm sütunlarda OF bağımsız değişkeni column_name yokluğunda.

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

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

LOCAL anahtar sözcüğünü kullanmak, yalnızca onu oluşturan paket, tetikleyici, saklı yordam veya kullanıcı tanımlı işlev içinde görünen yerel bir imleç oluşturur. Bir paket, tetikleyici, prosedür veya işlev sonlandırıldığında, imleç dolaylı olarak yok edilir. Bir imlecin 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ı kapanana kadar var olur.

FORWARD_ONLY belirtmek, oluşturur sıralı imleç; veriler yalnızca ilk satırdan sonuncuya doğru örneklenebilir.

SCROLL öğesinin belirtilmesi kaydırılabilir imleç; verilere herhangi bir sırayla ve herhangi bir yönde erişilebilir.

STATIC'in belirtilmesi statik imleç.

KEYSET'in belirtilmesi, bir anahtar imleç oluşturur.

DYNAMIC'in belirtilmesi dinamik imleç.

READ_ONLY imleci için FAST_FORWARD argümanını belirtirseniz, oluşturulan imleç hızlı veri erişimi için optimize edilecektir. Bu argüman, FORWARD_ONLY ve OPTIMISTIC argümanlarıyla birlikte kullanılamaz.

OPTIMISTIC argümanı ile oluşturulan bir imleç, o zamandan beri değiştirilen satırların değiştirilmesini ve silinmesini önler. imleç açma.

TYPE_WARNING bağımsız değişkeni ile sunucu, bir SELECT sorgusu ile uyumlu değilse, kullanıcıyı örtük bir imleç türü değişikliği konusunda bilgilendirecektir.

imleci açma

İçin imleç açma ve SELECT sorgu imlecini oluştururken belirtilenlerden gelen verilerle doldurulurken, aşağıdaki komut kullanılır:

Sonrasında imleç açmaçıktısı katmanlı bellekte depolanan ilişkili SELECT ifadesi yürütülür.

Bir imleçten veri alma

Hemen sonra imleç açma içeriğini (ilgili sorgunun sonucu) aşağıdaki komutla seçebilirsiniz:

FIRST öğesinin belirtilmesi, geçerli satır haline gelen tam imleç sonuç kümesinin ilk satırını döndürür.

LAST öğesinin belirtilmesi, imlecin en son satırını döndürür. Aynı zamanda geçerli çizgi haline gelir.

SONRAKİ belirtmek, tam sonuç kümesindeki geçerli satırdan hemen sonraki satırı döndürür. Şimdi 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 olur.

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

Argüman BAĞLI (satır_sayısı | @satır_sayısı_değişkeni) geçerli satırdan sonra belirtilen sayıda satır olan dizeyi döndürür. Satır sayısı için negatif bir değer belirtirseniz, mevcut satırdan önceki belirtilen satır sayısı kadar olan satır döndürülür. Boş değeri belirtmek, geçerli satırı döndürür. Döndürülen satır geçerli satır olur.

İle genel imleci aç, adından önce GLOBAL anahtar sözcüğünü gerektirir. İ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şkenlerin sırası, imleçteki sütunların sırasına uymalı ve değişkenin veri türü, imleç sütunundaki veri türüyle eşleşmelidir. INTO yapısı belirtilmemişse, FETCH komutunun davranışı SELECT komutunun davranışına benzeyecektir - veriler ekranda görüntülenir.

Verileri değiştirme ve silme

İmleci kullanarak değişiklik yapmak için aşağıdaki biçimde bir UPDATE komutu vermelisiniz:

İmlecin geçerli satırının birden çok sütunu tek bir işlemde değiştirilebilir, ancak hepsinin aynı tabloya ait olması gerekir.

Bir imleç kullanarak verileri silmek için aşağıdaki biçimde DELETE komutunu kullanın:

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

imleç kapat

Kapattıktan sonra, imleç program kullanıcıları için erişilemez hale gelir. Kapatırken, çalışması sırasında ayarlanan tüm kilitler kaldırılır. Kapatma yalnızca açık imleçlere uygulanabilir. kapalı ama değil serbest imleç yeniden açılabilir. Açılmamış bir imleci kapatmaya izin verilmez.

İmleci Serbest Bırakmak

imleç kapat isteğe bağlı olarak onunla ilişkili belleği serbest bırakır. Bazı uygulamalarda, onu DEALLOCATE deyimiyle açıkça ayırmanız gerekir. Sonrasında imleci serbest bırakmak bellek de serbest bırakılır ve imleç adı yeniden kullanılabilir.

İmlecin sonuna ne zaman ulaşıldığını kontrol etmek için şu fonksiyonun kullanılması önerilir: @@FETCH_STATUS

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

0 getirme başarılıysa;

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

2 Silinen veya değiştirilen 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 " Shopping List" DECLARE klient_cursor SEÇİM İÇİN CURSOR YEREL Müşteri Kimliği, Şirket, Soyadı NEREDE Müşteriden Şehir="Moskova" Şirkete Göre SİPARİŞ, Soyadı AÇIK klient_cursor SONRAKİ klient_cursor'DAN @id_kl, @firm, @fam WHILE @@F =0 BEGIN SELECT @message="Müşteri " [e-posta korumalı]+ "Şirket"+ @firm PRINT @message SELECT @message="Ürün Adı Satın Alma Tarihi Fiyat" YAZDIR @message TOvar_cursor SEÇİM İÇİN İMLECİ BİLDİRİM Öğe.Adı, Ticaret.Tarih, Öğe.Fiyat*Ticari.Miktar Öğe İÇ BİRLEŞTİRMEDEN MALİYETİ OLARAK Mallar Üzerindeki İşlem. ItemCode=Anlaşma.ItemCode NEREDE Anlaşma.MüşteriKodu [e-posta korumalı] _kl tovar_cursor AÇIK SONRAKİ tovar_cursor INTO @nam, @d, @p IF @@FETCH_STATUS<>0 YAZDIR " Satın alma yok" @@FETCH_STATUS=0 WHILE SELECT @message=" " [e-posta korumalı]+" "+ CAST(@d AS CHAR(12))+" "+ CAST(@p AS CHAR(6)) PRINT @message SET @ [e-posta korumalı][e-posta korumalı] tovar_cursor'DAN @nam, @d, @p İÇERİSİNE SONRAKİ GETİR tovar_cursor DEALLOCATE tovar_cursor SELECT @message="Toplam maliyet "+ CAST(@s AS CHAR(6)) YAZDIR @message -- sonraki müşteriye geç-- SONRAKİ AL klient_cursor'dan INTO @id_kl, @firm, @fam END KAPAT klient_cursor DEALLOCATE klient_cursor Örnek 13.6. Moskova'dan müşteriler tarafından satın alınan malların listesini ve toplam maliyetlerini görüntülemek için imleç.

Örnek 13.7. Moskova'dan gelen müşteriler için kaydırılabilir bir imleç geliştirin. Telefon numarası 1 ile başlıyorsa, o numaraya sahip müşteriyi kaldırın ve ilk imleç girişinde telefon numarasındaki ilk haneyi 4 ile değiştirin.

DECLARE @firm VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @message VARCHAR(80) YAZDIR " Müşteri Listesi" DECLARE klient_cursor SEÇİM İÇİN KÜRESEL KAYDIRMA TUŞU Şirket, Soyadı, İstemciden Telefon Şehir ="Moskova" Firmaya Göre SİPARİŞ, Soyadı GÜNCELLEME İÇİN AÇIN klient_cursor SONRAKİ klient_cursor'DAN @firm, @fam, @tel İLE AL @@FETCH_STATUS=0 SELECT @message="Client" [e-posta korumalı]+ "Firma" [e-posta korumalı]" Phone "+ @tel PRINT @message -- telefon numarası 1 ile başlıyorsa -- bu numaraya sahip müşteriyi silin EĞER @tel '%1' GİBİ GİDERSE İstemci KLENT_cursor'UN MEVCUT OLDUĞU YERDE BAŞKA BİR ŞEKİLDE -- sonraki istemciye gidin klient_cursor INTO'DAN SONRAKİ GETİR @firm, @fam, @tel END MUTLAK 1'İ klient_cursor'dan @firm, @fam, @tel'e AL -- ilk girişte, -- telefon numarasındaki ilk haneyi 4 GÜNCELLEME Client SET Phone='4' + SAĞ( @tel,LEN(@tel)-1)) NEREDE klient_cursor SELECT @message="Client " [e-posta korumalı]+" Firma "+ @firm " Telefon "+ @tel PRINT @message KAPAT klient_cursor DEALLOCATE klient_cursor Örnek 13.7. Moskova'dan gelen müşteriler için kaydırılabilir imleç.

Örnek 13.8. kullanım bir prosedürün çıktı parametresi olarak imleç. Prosedür bir veri seti döndürür - bir mal listesi.

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

DECLARE @my_cur CURSOR DECLARE @n VARCHAR(20) EXEC my_proc @ [e-posta korumalı] _cur ÇIKTI @my_cur INTO'DAN SONRAKİ ALTI @n SELECT @n WHILE (@@FETCH_STATUS=0) @my_cur INTO'DAN SONRAKİ ALMA BAŞLA @n SELECT @n END KAPAT @my_cur DEALLOCATE @my_cur

Rebeca M. Riordan "Transact-SQL'de İmleçler"

İnternet Bilgi Teknolojileri Üniversitesi

http://www.INTUIT.ru

Eğitim kursu: "Microsoft SQL Server 2000'de Programlama"

İmleç, programlarda ve saklı yordamlarda kullanılmak üzere tasarlanmış özel bir geçici SQL nesnesidir. Bununla, her bir satırını ayrı ayrı okuyup işleyerek, sorgu satırlarının sonuç kümesi arasında dolaşabilirsiniz. Saklı yordamlarda, SELECT ifadesinin sözdizimini kullanarak ifade edilmesi zor olan karmaşık hesaplamaları gerçekleştirmek için imleçleri kullanabilirsiniz. Dersin geniş teorik materyali çok iyi örneklerle tamamlanmaktadır. Özellikle, CURSOR_STATUS işlevinin uygulanması, @@CURSOR_ROWS ve @@FETCH_STATUS değişkenlerinin açıklaması ve çok daha fazlası dikkate alınır.

Öğreneceksiniz:

  • bir imleç bildir;
  • imleci aç;
  • imleci kapat;
  • imleci serbest bırakın;
  • basit bir FETCH komutu kullanın;
  • dizeyi değişkenlere getir;
  • mutlak konumuna göre bir dize seçin;
  • göreli konumuna göre bir satır seçin;
  • konumsal değişiklik yapmak;
  • konumsal silme işlemini gerçekleştirin;
  • imleç kümesindeki satır sayısını belirlemek için @@CURSOR_ROWS global değişkenini kullanın;
  • FETCH komutunun sonuçlarını belirlemek için @@FETCH_STATUS global değişkenini kullanın;
  • imleç durumunu sorgulamak için CURSOR_STATUS işlevini kullanın.

İlişkisel veritabanlarının karakteristik özelliklerinden biri, eylemlerin satır kümeleri üzerinde gerçekleştirilmesidir. Bir küme boş olabilir veya yalnızca bir satır içerebilir, ancak yine de küme olarak kabul edilir. Bu, ilişkisel işlemler için gerekli ve kullanışlı bir özelliktir, ancak bazen uygulamalar için elverişsiz olabilir.

Örneğin, bir kümede belirli bir satırı göstermenin bir yolu olmadığından, satırları birer birer kullanıcıya sunmak zor olabilir. Transact-SQL tarafından standart SQL diline sağlanan uzantılar çok daha fazla programlama gücüne izin verse de, belirlenen ilkelere göre gerçekleştirilmesi zor, zaman alıcı ve hatta imkansız olan işlemler vardır.

Bunun gibi durumlarla başa çıkmak için SQL imleçler sağlar. İmleç, bir kümedeki belirli bir satırı işaret eden bir nesnedir. Oluşturduğunuz imlecin doğasına bağlı olarak, imleci küme içinde hareket ettirebilir ve verileri değiştirebilir veya silebilirsiniz.

İmleç kavramı

Microsoft SQL Server aslında iki farklı imleç türünü destekler: Transact-SQL imleçleri ve API imleçleri (uygulama programlama arabirimi imleçleri). API imleçleri, Microsoft ActiveX Veri Nesneleri (ADO), OLE DB, ODBC veya DB Kitaplığı kullanan bir uygulama içinde oluşturulur. Bu API'lerin her biri biraz farklı işlevleri destekler ve farklı bir sözdizimi kullanır. Cursors API'yi burada ayrıntılı olarak tartışmayacağız; Bunları kullanmayı planlıyorsanız, lütfen API ve kullanmayı düşündüğünüz programlama dili için ilgili belgelere bakın.

Transact-SQL imleçleri, DECLARE CURSOR komutu kullanılarak oluşturulur. Hem imleç nesnesi hem de işaret ettiği satır kümesi sunucuda bulunmalıdır. Bu tür imleçlere sunucu imleçleri denir. Bir ağ üzerinden SQL Server'a bağlı bir uygulamadan bir sunucu imleci kullanıyorsanız, her imleç işlemi iki yönlü ağ iletişimi gerektirir. Sunucu imleçlerini destekleyen imleç API kitaplıkları, istemci sisteminde bulunan ve işlediği dizeleri istemcide önbelleğe alan bir istemci imlecini de destekler.

İmleç tarafından işaret edilen satır kümesi SELECT komutu kullanılarak belirlenir. Bir Transact-SQL imleci oluştururken, SELECT deyiminde birkaç kısıtlama vardır:

SELECT komutu birden çok sonuç kümesi döndüremez;

SELECT komutu, yeni bir tablo oluşturmak için bir INTO yan tümcesi içeremez;

SELECT komutu, sonuçları toplamak için kullanılan bir COMPUTE veya COMPUTE BY yan tümcesi içeremez. (Ancak, AVG gibi toplama işlevleri içerebilir.)

imleç özellikleri

Transact-SQL, birkaç farklı imleç türünü destekler. İmleçlerin her birinin çeşitli özelliklerini bulmak oldukça sıkıcı bir iştir, ancak her imleç türü için az ya da çok üç bağımsız özelliği hesaba katarsak daha kolay hale getirilebilir: kaynak verilerdeki değişiklikleri yansıtma yeteneği, birden çok satır arasında kaydırma yeteneği ve birden çok satırı değiştirme yeteneği.

Değişimin yansıması

Bir imlecin verilerdeki değişiklikleri yansıtma yeteneğine imleç duyarlılığı denir. Bir ifade için bir imleç oluşturduğunuzu varsayalım:

SELECT * FROM NEREDE Left(OilName, 1) = "B" Aromaterapi veritabanı, Şekil 1'de gösterildiği gibi dört satır döndürür. İmleci kullanırken, birisi Bergamot öğesi için bir Açıklama değeri eklerse veya Bayberry öğesi için bir dize eklerse, imlecinizin işaret ettiği dize kümesine ne olur?

Pirinç. 1. Aromaterapi veritabanı, B harfi ile başlayan dört satır içerir.

İmlecinizi oluşturduğunuzda, iki tür hassasiyet bağımsız olarak tanımlanabilir: kümeye hangi satırların dahil edildiğine (küme üyeliği) ilişkin değişiklikler ve değişikliklerin orijinal satırlara yansıtılıp yansıtılmadığı.

kaydırma

İmlecin ikinci özelliği, hem ileri hem geri ya da yalnızca ileri kaydırma yeteneğidir. Burada çok eski bir programlama ikilemi var: hıza karşı esneklik. Sıralı imleçler (yalnızca ileri) çok daha hızlıdır, ancak daha az esnekliğe sahiptir.

Güncelleme

İmleçleri sınıflandırmak için kullanılan son özellik, imleç tarafından satırları güncelleme yeteneğidir. Yine, salt okunur imleçler genellikle daha performanslıdır ancak daha az esnektir.

imleç türleri

Transact-SQL dört farklı imleç türünü destekler: statik, anahtar, dinamik ve hızlı erişim veya "yangın hortumu" imleçleri. Her imleç türü, işaret ettiği satırlar hakkında farklı veriler depolar ve her imleç türü, önceki bölümde tartışılan özelliklerin farklı kombinasyonlarına sahiptir.

Statik imleçler

Statik bir imleç, SELECT deyimi tarafından belirtilen verilerin anlık görüntüsünü alır ve bunu tempdb veritabanında saklar. Yapı veya veri değerlerindeki değişiklikleri "hissetmez" ve herhangi bir değişiklik yalnızca kopyaya yansıtılacağından, bu imleç her zaman salt okunur modda açılır. Ancak statik imleçler sıralı veya kaydırılabilir olarak bildirilebilir.

Anahtar İmleçler

Anahtar imleç, yalnızca her satırı benzersiz şekilde tanımlayan bu sütunları tempdb'ye kopyalar. Bir anahtar imleci bildirebilmek için, SELECT ifadesinin tanımına dahil edilen her tablonun, kopyalanacak kümeyi - anahtarı belirten benzersiz bir indeksi olmalıdır.

Anahtar imleçler değiştirilebilir veya salt okunur olabilir. Ayrıca kaydırılabilir veya sıralı olabilirler.

Bir tuş imlecindeki üyelik, imlecin bildirildiği anda sabitlenir. İmlecin açık durumu sırasında seçim koşulunu karşılayan bir dize eklenirse, kümeye eklenmez. Filtre koşulu olarak LEFT(OilName, 1) = "B" kullanılan önceki örneğimizde, imlecin kapsamı ile ilgili satırlara OilName alanının değeri "Bayberry" olan yeni bir satır eklenmeyecektir. .

Benzer şekilde, "Basil" i "Kumquat" olarak değiştirmek gibi küme üyelik koşulunu karşılamayan bir dizede bir değişiklik yapılırsa, dize yine de kümenin bir üyesi olarak kalacaktır. Bir satır silinse bile hala kümenin bir üyesidir, ancak SQL Server tüm sütun değerleri için NULL döndürür.

İmleç açıldıktan sonra imlecin set üyeliği sabit kalsa da, kaynak tablolara yapılan veri değerlerinde yapılan değişiklikler yine de yansıtılır. Örneğin, Bergamot dizesi için Açıklama alanının değerini değiştirmek, imleç tarafından döndürülecektir. Ancak, tuş takımı değerlerinde yapılan değişiklikler, yalnızca imleç içinde gerçekleşirse imleçlere yansıtılır. Önceki örnekle devam edersek, imleç içinde OilName alanının değeri "Basil" iken "Kumquat" olarak değiştirilirse, imleç "Kumquat" döndürür. Değişiklik başka bir kullanıcı tarafından yapılmışsa, imleç yine de "Basil" öğesini döndürür.

Tavsiye. Bir sonraki bölümde göreceğimiz gibi, bir imleç oluşturmak ve bir imleç açmak farklı işlemlerdir. Bir tuş imlecinin içeriğini güncellemek için onu kapatıp yeniden açabilirsiniz.

Dinamik İmleçler

Dinamik bir imleç, satıra her erişildiğinde SELECT ifadesi yeniden yürütülüyormuş gibi davranır. (Aslında işler biraz daha farklı çalışır, ancak bu temsil dinamik imleçlerin çalışmasını daha iyi değerlendirmenize olanak tanır.) Dinamik imleçler, bu değişikliklerin kaynak verinin hem üyeliği hem de değerleri ile ilgili değişiklikleri yansıtır, bu değişikliklerin kaynak verinin içinde yapılıp yapılmadığına bakılmaksızın. imleç veya başka bir kullanıcı tarafından girildi.

Dinamik imleçlerle ilgili bir sınırlama vardır: imleci tanımlamak için kullanılan SELECT ifadesi, yalnızca ORDER BY yan tümcesinde kullanılan sütunları içeren bir dizin varsa bir ORDER BY yan tümcesi içerebilir. Bir dizin üzerinde çalışmayan bir ORDER BY yan tümcesi kullanarak bir anahtar imleç bildirirseniz, SQL Server imleci bir anahtar imlece dönüştürür.

Hızlı Erişim İmleçleri

SQL Server, kaydırılamaz, salt okunur bir imlecin özel, optimize edilmiş bir biçimini destekler. Bu tür imleç, FAST_FORWARD anahtar sözcüğü kullanılarak bildirilir ve en yaygın olarak "yangın hortumu" imleci olarak adlandırılır.

Ateş imleçleri çok güçlüdür, ancak kullanımlarında iki önemli sınırlama vardır. İlk olarak, bir imleç tanımı SELECT deyiminde metin, ntext veya görüntü sütunları ve TOP ifadesini kullandıysanız, SQL Server imleci bir anahtar imlece dönüştürür.

İkinci olarak, imleci tanımlamak için kullandığınız SELECT deyimi, tetikleyicileri olan ve olmayan tabloları içeriyorsa, imleç statik olana dönüştürülür. Tetikleyiciler, bir Veri Manipülasyon Dili (DML) deyimleri tablosuna karşı yürütüldüğünde sunucu tarafından otomatik olarak yürütülen Transact-SQL komut dosyalarıdır. Tetikleyicilere Ders 29'da daha ayrıntılı olarak bakacağız, ancak şimdilik şu noktaya odaklanalım: Eğer birisi imleç tarafından kullanılan tablolardan birine bir tetikleyici eklerse, SQL Server daha hızlı dönüştürdüğü için uygulamanız aniden durabilir. imleci daha yavaş olana getirin.

İmleçleri Kullanma

İmleçleri kullanmak, yerel değişkenleri kullanmak gibidir - onları bildirirsiniz, bir değer belirlersiniz ve sonra kullanırsınız. Ancak, kapsam dışına çıktıklarında otomatik olarak yok edilen yerel değişkenlerin aksine, imleç tarafından kullanılan satırları açıkça serbest bırakmanız ve ardından imleci yok etmeniz gerekir.

İmleç Oluşturma

İmleç kullanmanın ilk adımı onu oluşturmaktır. Transact-SQL imleçleri, DECLARE CURSOR deyimi kullanılarak oluşturulur.

Dikkat! SQL Server, imleç oluşturmak için iki farklı yöntemi destekler: SQL-92 sözdizimini kullanma ve Transact-SQL sözdizimini kullanma. SQL-92 sözdizimi, ANSI standardına uygundur, ancak burada tartışılan Transact-SQL sözdiziminden daha az işlevselliğe sahiptir.

DECLARE CURSOR deyimi aşağıdaki sözdizimine sahiptir:

DECLARE imleç_adı İMLEÇ

[görünürlük]

[taslak]

[kilit]

Select_operator İÇİN

Lütfen imlecin özelliklerini tanımlayan tüm parametrelerin - görünürlük, tür vb. - isteğe bağlıdır. Bu seçenekler için varsayılan değerler karmaşıktır ve kaynak kayıtlar veya görünümlerle veya veritabanıyla çalışma seçenekleriyle nasıl etkileşim kurulacağını belirtebilir veya belirtmeyebilir. Operatörün okunmasını daha kolay hale getirmek için, ihtiyacınız olan tüm parametreleri açıkça ayarlamak daha iyidir. Bu şekilde tam olarak ne alacağınızı bileceksiniz.

İmleç görünürlüğü, geçici tablolar bildirilirken @local_table veya @@global_table anahtar sözcükleri ile aynı etkiye sahip olan LOCAL veya GLOBAL anahtar sözcükleri kullanılarak tanımlanır.

Tavsiye. SQL Server, kapsam dışına çıktığında (görünürlük) yerel imleci kapatır ve serbest bırakır, ancak bunu her zaman açıkça yapmak en iyisidir.

scroll parametresi, sırasıyla, yalnızca baştan sona veya herhangi bir yönde hareket etme yeteneğini belirten FORWARD_ONLY ve SCROLL anahtar sözcüklerinin kullanımına izin verir.

type parametresi, oluşturulacak imlecin türünü belirtir. Geçerli anahtar kelimeler STATIC, KEYSET, DYNAMIC ve FAST_FORWARD'dır. FAST_FORWARD tür parametresi ve FORWARD_ONLY kaydırma parametresi birbirini dışlar.

Kilit seçeneği, satırların imleç tarafından değiştirilip değiştirilemeyeceğini ve eğer öyleyse, diğer kullanıcılar tarafından değiştirilip değiştirilemeyeceğini belirler. READ_ONLY anahtar sözcüğü kullanılırsa, imleç orijinal verilerde herhangi bir değişiklik yapamaz. Ancak, diğer kullanıcılar verileri değiştirebilir veya UPDATE deyimini kullanarak bunu kendiniz yapabilirsiniz. Kilit parametresi olarak SCROLL_LOCKS belirtilmişse, güncellemeler yalnızca imleç tarafından gerçekleştirilebilir. Aynı paket içindeki veya diğer kullanıcılar tarafından sağlanan diğer tüm UPDATE ifadeleri başarısız olacaktır.

Son kilitleme seçeneği OPTIMISTIC, imlecin hem içinde hem de dışında satır güncellemelerine izin verir. Bu en esnek seçenektir, ancak imleç tarafından okunduktan sonra satır değiştirilmişse, imleç tarafından yapılan bir değişikliğin başarısız olma olasılığı her zaman vardır.

TYPE_WARNING parametresi, imleç türü belirtilen türden başka bir türe dönüştürülürse, SQL Server'a istemciye bir uyarı mesajı göndermesi talimatını verir. Bu, verilen SELECT ifadesini desteklemeyen bir imleç bildirirseniz mümkündür.

FOR yan tümcesinde belirtilen select_operator parametresi gereklidir. İmleç kümesine dahil edilecek satırları belirtir.

FOR UPDATE yan tümcesi isteğe bağlıdır. READ_ONLY ayarlanmadıkça imleçler varsayılan olarak değiştirilebilir, ancak sonuçtan emin olmak için bu ifadeyi kullanmak yine de iyi bir fikirdir. Değiştirilmesine izin verdiğiniz belirli satırları belirtmek için sütun_adlarının OF yan tümcesini kullanabilirsiniz. Sütun_adlarının OF bölümünü atlarsanız, değişiklik SELECT deyiminde belirtilen tüm sütunlarda gerçekleştirilebilir.

imleç değişkenleri

Transact-SQL, CURSOR türündeki değişkenleri bildirmenize olanak tanır. Bu durumda, standart DECLARE sözdizimi bir imleç oluşturmaz; SET anahtar sözcüğünü kullanarak imleç için değişkeni açıkça ayarlamanız gerekir.

myCursor IMLEÇ BİLDİR

Yağlardan Yağ Adı SEÇMEK İÇİN

DECLARE @myCursorVariable CURSOR

SET @myCursorVariable = myCursor

Bu sözdizimi, farklı imleçlere atanabilecek değişkenler oluşturmak istiyorsanız kullanışlıdır. Farklı sonuç kümeleriyle çalışmak için genel bir prosedür oluşturuyorsanız bu gerekli olabilir.

Bir imleç değişkeni bildirebilir ve ardından bunu doğrudan bir imleç oluşturmak için kullanabilirsiniz.

DECLARE @myCursorVariable CURSOR SET @myCursorVariable = CURSOR LOCAL FAST_FORWARD Yağlardan Yağ Adı SEÇMEK İÇİN

Bu sözdizimi ile imlecin tanımlayıcısı yoktur ve yalnızca bir değişken aracılığıyla başvurulabilir.

imleci açma

Bir imleç bildirimi, bir imleç nesnesi oluşturur, ancak imlecin değiştireceği bir kayıt kümesi (imleç kümesi) oluşturmaz. İmleci açana kadar imleç seti oluşturulmaz. DECLARE CURSOR ifadesinin oldukça karmaşık sözdiziminden sonra, ifadenin sözdizimi oldukça şeffaf görünüyor:

OPEN imleç_veya_değişken

GLOBAL anahtar sözcüğü, çakışmaların önlenmesine yardımcı olur: LOCAL anahtar sözcüğüyle bildirilen bir imleç ve GLOBAL anahtar sözcüğüyle bildirilen bir imleç aynı tanımlayıcıya sahipse, GLOBAL anahtar sözcüğünü kullanmadığınız sürece imlece yapılan başvurular varsayılan olarak yerel imleç olacaktır. Diğer benzer durumlarda olduğu gibi, genel bir imleç açıyorsanız anahtar kelimeyi açıkça belirtmek en iyisidir.

imleç kapat

İmleci kullanmayı bitirdiğinizde, onu kapatmalısınız. CLOSE deyimi, imleç kümesini korumak için kullanılan kaynakları ve ayrıca DECLARE deyiminde SCROLLOCKS seçeneğini kullandıysanız, satırlarda tutulan tüm kilitleri serbest bırakır. CLOSE komutunun sözdizimi, OPEN ifadesinin sözdizimiyle hemen hemen aynıdır - yalnızca anahtar sözcük değişir:

KAPAT imleç_veya_değişkeni

İmleci Serbest Bırakmak

İmleç oluşturma dizisindeki son ifade DEALLOCATE ifadesidir. Sözdizimi de basittir:

DEALLOCATE imleç_veya_değişken

Ancak burada bir incelik vardır: DEALLOCATE ifadesi bir tanımlayıcıyı veya imleç değişkenini siler, ancak imlecin kendisini mutlaka silmez. İmlecin kendisi, kendisine atıfta bulunan tüm tanımlayıcılar serbest bırakılıncaya veya süresi dolana kadar (kapsam dışındayken) silinmez. Aşağıdaki örnekleri göz önünde bulundurun:

Bir imleç oluşturun myCursor CURSOR KEYSET READ_ONLY FOR SELECT * FROM Oils -- Bir imleç değişkeni oluşturun DECLARE @cursorVariable CURSOR -- Bir dizi imleç girişi oluşturun OPEN myCursor -- Bir imlece bir değişken atayın SET @cursorVariable = myCursor -- Serbest bırak imleç DEALLOCATE myCursor

İmleç serbest bırakıldıktan sonra, myCursor tanımlayıcısı artık imleç kümesiyle ilişkilendirilmez, ancak imleç kümesine hala @cursorVariable değişkeni tarafından başvuruda bulunulduğundan, imleç ve imleç kümesi serbest bırakılmaz. İmleç değişkenini de açıkça serbest bırakmadığınız sürece, imleç ve imleç seti, değişkenin süresi dolana kadar var olacaktır.

İmleç ile Dizeleri Manipüle Etme

Onlarla bir şeyler yapamıyorsanız, imleçler kendi başlarına ilgi çekici olmaz. Transact-SQL, üç farklı imleç komutunu destekler: FETCH, UPDATE ve DELETE.

FETCH komutu, belirtilen dizeyi imleç satırları kümesinden alır. En basit haliyle, FETCH komutu aşağıdaki sözdizimine sahiptir:

FETCH imleç_veya_değişkeni

Bu kayıt biçimi, imleç konumundaki satırı (geçerli satır) döndürür.

Basit bir FETCH komutu kullanın

  1. Kök dizindeki SQL 2000 Adım Adım klasörüne gidin, SimpleCursor adlı komut dosyasını vurgulayın ve Aç düğmesine tıklayın.
  2. Query Analyzer, komut dosyasını Sorgu penceresine yükler.

Tavsiye. Bu betiğin ilgili SELECT ifadesinden daha uzun sürdüğünü fark etmiş olabilirsiniz. Gerçek şu ki, bir imleç oluşturmak ve açmak ek zaman gerektirir. Görevi tamamlamak için bir SELECT ifadesi yeterliyse asla imleç kullanmayın.

FETCH komutu yalnızca doğrudan bir dize döndürmekle kalmaz, aynı zamanda döndürülen sütundan gelen değerleri değişkenlerde saklamanıza da olanak tanır. Bir FETCH komutunun sonuçlarını bir değişkende saklamak için aşağıdaki sözdizimini kullanın:

FETCH imleç_veya_değişken INTO değişken_listesi

Değişken_listesi, değişken tanımlayıcılarının virgülle ayrılmış bir listesidir. FETCH komutunu çalıştırmadan önce değişkenleri bildirmelisiniz. Varlist, imleci tanımlayan SELECT ifadesinde görünen her sütun için bir değişken içermelidir. Değişkenin veri türü, sütunun veri türüyle eşleşmeli veya uyumlu olmalıdır.

Değişkenlere yazarak satırları seçin

Önceki örneklerin tümünde, geçerli satırı döndürmek için FETCH ifadesi kullanıldı. FETCH ifadesinin sözdizimi, başka bir satırı belirtmek için bir dizi anahtar sözcük de sağlar. Bu anahtar kelimeleri kullanırken, FETCH ifadesi verilen satırı döndürür ve onu geçerli satır yapar.

Bu anahtar sözcükler, imleç kümesi içinde mutlak bir konum belirlemenize olanak tanır. FIRST ve LAST anahtar sözcükleri sırasıyla ilk ve son satırları döndürürken, ABSOLUTE n, imlecin kayıt kümesinin başlangıcından (n pozitifse) veya sonundan (n negatifse) n satırını belirtir. n'nin değeri bir sabit (3) veya bir değişken (@theRow) olarak ifade edilebilir.

Mutlak konumlarına göre satırları seçin

  1. FetchAbsolute adlı betiği vurgulayın ve Aç düğmesine tıklayın. Query Analyzer, komut dosyasını Sorgu penceresine yükler.

FETCH deyimi, satırları mutlak konumlarına göre almanızı sağlayan anahtar sözcüklere ek olarak, satırları geçerli satıra göre konumlarına göre almanızı sağlayan üç anahtar sözcük sağlar. FETCH NEXT operatörü sonraki satırı, FETCH PRIOR operatörü önceki satırı ve FETCH RELATIVE n operatörü geçerli satırdan n satırını döndürür. FETCH ABSOLUTE n deyimi gibi, FETCH RELATIVE n deyimi, n negatifse geçerli satırdan önceki satırları ve n pozitifse geçerli satırdan sonraki satırları belirtebilir.

Göreli konumlarına göre satırları seçin

  1. FetchRelative adlı komut dosyasını vurgulayın ve Aç düğmesini tıklayın. Query Analyzer, komut dosyasını Sorgu penceresine yükler.

İmleç FORWARD_ONLY veya PAST_FORWARD türündeyse, konumu belirtmek için yalnızca NEXT anahtar sözcüğü kullanılabilir. Aslında, imleç bu türlerden biriyse, NEXT anahtar sözcüğüne gerek yoktur. SQL Server, her FETCH ifadesinin aslında bir FETCH NEXT ifadesi olduğunu varsayar.

Hızlı bir imleç için FETCH NEXT ifadesini kullanın

  1. FetchFirehose adlı betiği vurgulayın ve Aç düğmesine tıklayın. Query Analyzer, komut dosyasını Sorgu penceresine yükler.

Query Analyzer araç çubuğundaki Run Query düğmesini tıklayın. Query Analyzer, sorguyu yürütecektir.

İmleçler aracılığıyla satırları değiştirme ve silme

İmleciniz değiştirilebilir ise. İmleç kümesindeki başlangıç ​​değerlerini değiştirmek oldukça basittir. WHERE yan tümcesinin bir imleç aracılığıyla değiştirmeyi destekleyen özel bir biçimi vardır:

GÜNCELLEME tablo_veya_görünüm list_to_modify YERLEŞTİRİCİ_veya_değişken NEREDE GÜNCELLENİR

Buna konumsal güncelleme denir. Transact-SQL ayrıca aşağıdaki gösterime sahip konumsal silmeyi de destekler:

SİL tablo_veya_görünüm NEREDE imleç_veya_değişkenin GÜNCEL OLARAK

Konumsal bir güncelleme gerçekleştirin

  1. PositionedUpdate adlı komut dosyasını vurgulayın ve Aç düğmesine tıklayın. Query Analyzer, komut dosyasını Sorgu penceresine yükler.

Query Analyzer araç çubuğundaki Execute Query düğmesini tıklayın. Query Analyzer, sorguyu yürütecektir. İki ızgara panelinin görüntülendiğini unutmayın. İlki FETCH deyimi tarafından oluşturulur ve sütunların ilk içeriğini içerir. İkincisi, SELECT ifadesinin sonucudur ve değişiklikten sonra Açıklama alanının değerini içerir.

Transact-SQL İmleçlerini İzleme

Transact-SQL, imlecinizin çalışmasını ve durumunu kontrol etmenize yardımcı olacak iki global değişken ve bir işlev sağlar. @@CURSOR_ROWS değişkeni, bağlantıda açılan son imleç kümesindeki satır sayısını döndürür. @@CURSOR_ROWS tarafından döndürülen değerler Tablo 1 de gösterilmiştir.

@@FETCH_STATUS değişkeni, son FETCH komutunun yürütülmesi hakkında bilgi verir. Tablo 2, @@FETCH_STATUS değişkeni tarafından döndürülen değerleri göstermektedir.

Son olarak, Transact-SQL, CURSOR_STATUS işlevini sağlar. Bu işlev aşağıdaki sözdizimine sahiptir:

CURSOR_STATUS(tür, imleç_veya_değişken) Tür "yerel", "genel" veya "değişken" olabilir ve imleç_veya_değişkeni, alınacak imleç veya imleç değişkeninin tanımlayıcısıdır. CURSOR_STATUS işlevi tarafından döndürülen sonuçlar Tablo 3'te gösterilmektedir.

İmleç izleme özelliklerini kullanın

  1. StatusFunctions komut dosyasını vurgulayın ve Aç düğmesine tıklayın. Query Analyzer, komut dosyasını Sorgu penceresine yükler.

Baskı versiyonu

İmleç, bir SELECT deyimi tarafından döndürülen sonuç kümesindeki satırları tek tek işlemenize izin veren bir nesnedir. Transact-SQL dilinde desteklenen imleçler daha sonra tartışılacaktır. Bunlar, veritabanı sunucusunun yanında nesneler olarak bulunan sunucu imleçleridir. İstemci tarafı veritabanı uygulamaları oluşturmak için kullanılan istemci tarafı imleçler de vardır.

Literatürde, vakaların büyük çoğunluğunda bir imleç kullanılarak bir veri kümesinin satır satır işlenmesinin, satır kümelerini işlemek için SQL araçları tarafından gerçekleştirilen benzer eylemlerden önemli ölçüde daha yavaş olduğu belirtilmektedir. Bu nedenle, imleçlerin yalnızca satır kümeleriyle işlemler yoluyla gerekli eylemlerin açıklamasının açıkça yetersiz veya hatta imkansız olduğu durumlarda kullanılması önerilir.

Bir imleçle çalışmak genellikle aşağıdaki adımları içerir:

  • imleç bildirimi;
  • açılış imleci;
  • öznitelik değerlerini ilk imleç girişinden değişkenlere okumak;
  • imleç üzerinde hareket etme (genellikle bir döngüde) ve imleç girişlerini işleme;
  • imleci kapat;
  • imlece ayrılan belleği boşaltmak.

Biçimi aşağıda gösterilen DECLARE deyimi kullanılarak bir imleç bildirilir. SQL Server'da bu ifadenin hem ISO SQL standardının sözdizimini (standartın sürümü belgelerde belirtilmemiştir) hem de CURSOR Transact-SQL dil uzantıları kümesini kullanan sözdizimini desteklediğine dikkat edilmelidir.

FOR select_deyimi

Genişletilmiş Transact-SQL Sözdizimi:

DECLARE imleç_adı İMLEÇ

FOR select_deyimi

]][;]

GLOBAL anahtar sözcüğünü belirtmek, bildirilmekte olan imlecin, sunucuya olan geçerli bağlantı içinde yürütülen herhangi bir iş toplu işleminde, tetikleyicide veya saklı yordamda kullanılabilir olduğu anlamına gelir. İmleç, yalnızca bağlantı koptuğunda örtük olarak serbest bırakılır.

Varsayılan olarak veya YEREL açıkça belirtildiğinde oluşturulan bir "yerel" imleç yalnızca iş toplu işleminde, saklı yordamda veya oluşturulduğu tetikleyicide kullanılabilir. Böyle bir imleç, toplu işlem, saklı yordam veya tetik yürütmeyi tamamladığında örtük olarak serbest bırakılır. Bunun istisnası, imlecin saklı bir prosedürün çıkış parametresinden (OUTPUT) geçirilmesidir. Ardından, kendisine atıfta bulunan tüm değişkenler serbest bırakıldığında veya "kapsam"dan çıkıldığında imleç serbest bırakılır.

FORWARD_ONLY, imleç boyunca yalnızca ileriye doğru "hareket edebileceğiniz" anlamına gelir (yalnızca FETCH NEXT komutu kullanılabilir, aşağıya bakın), yani. imleçteki her giriş en fazla bir kez işlenebilir. STATIC, KEYSET veya DYNAMIC anahtar sözcükleri olmadan YALNIZCA FORWARD belirtilirse, imleç bir DİNAMİK imleç gibi davranır (aşağıya bakın). FORWARD_ONLY veya SCROLL seçeneklerinden hiçbiri belirtilmemişse ve STATIC, KEYSET veya DYNAMIC anahtar sözcüklerinden hiçbiri belirtilmemişse, FORWARD_ONLY seçeneği varsayılan olarak ayarlanır.

SCROLL, imleç üzerinde herhangi bir yönde "hareket edebileceğiniz" anlamına gelir (FETCH operatöründe, FIRST, LAST, PRIOR, NEXT, RELATIVE, MUTLAK kullanılabilir). SCROLL seçeneği, FAST_FORWARD seçeneği ile belirtilemez. STATIC, KEYSET ve DYNAMIC imleçler varsayılan olarak SCROLL'dur.

STATİK, imlecin güncellenmediği anlamına gelir. Böyle bir imlecin elde edilen veri seti, veritabanından alınır ve geçici nesneler tempdb için veritabanında saklanır. İmleç için temel teşkil eden tablolarda yapılan değişiklikler bundan sonra imleçte görüntülenmeyecektir.

KEYSET - bu tür imleç için, seçilen kayıtları tanımlayan bir dizi anahtar değer geçici bir tabloda saklanır. İmleç üzerinde hareket ederken, anahtar olmayan özniteliklerin değerleri ilgili tablolardan alınır, bu nedenle imleçle çalışırken anahtar olmayan sütunlardaki değişiklikler görünür olacaktır. İmleçteki satır, FETCH deyimi tarafından getirildiğinde tablodan zaten kaldırılmışsa, @@ FETCH_STATUS hizmet değişkeni -2 değerini döndürür. İmleç açıldıktan sonra tablolara eklenen satırlar imleç içinde görünmez. İmleci oluşturan sorgu, benzersiz bir dizine sahip olmayan en az bir tablo kullanıyorsa, KEYSET imleci STATIC'e dönüştürülür.

DYNAMIC, yeni eklenen satırlar da dahil olmak üzere, sonuç kümesindeki satırlarda yapılan tüm veri değişikliklerini görüntüleyen, kaynak kullanımı en yoğun imleç türüdür. Her örnekteki satırların veri değerleri, sırası ve üyeliği değişebilir. FETCH MUTLAK'ı dinamik imleçlerle kullanamazsınız.

FAST_FORWARD, bir satırdan diğerine yalnızca "ileri" geçmenize izin veren en hızlı imleç türüdür. Bu, varsayılan imleç türüdür (isteğe bağlı anahtar sözcükler atlandığında). FORWARD_ONLY ve READ_ONLY seçenekleriyle bildirilen bir imlece eşdeğerdir.

READ_ONLY - "salt okunur" bir imleç tanımlar: böyle bir imleç aracılığıyla veritabanında değişiklik yapılamaz.

SCROLL_LOCKS, SQL Server'ın imleç içinde okundukları sırada satırları kilitleyerek bu tür bir imleç aracılığıyla güncellenebilmelerini veya silinebilmelerini sağladığı anlamına gelir.

OPTIMISTIC anahtar sözcüğüyle bildirilen bir imleç, bir satır kilidi talep etmez ve verilerin değiştirilmesine izin verir. Veriler imlece okunduktan sonra temel tabloda değişiklikler meydana gelirse, bu verileri imleç aracılığıyla değiştirme girişimi bir hatayla sonuçlanır.

TYPE_WARNING, bir imleç örtük olarak istenen türden diğerine dönüştürülürse (örneğin, tabloda benzersiz bir dizin yokluğunda yukarıda açıklanan KEYSET'ten STATIC'e imleç dönüşümü), istemciye bir uyarı gönderileceğini belirtir.

Select_statement, imlecin sonuç kümesini oluşturan bir SELECT ifadesidir.

FOR UPDATE ifadesi, imleçte hangi sütunların güncelleneceğini belirtir. OF sütun_adı ise [, . . . n], o zaman değişiklikler için yalnızca listelenen sütunlar kullanılabilir olacaktır. Sütun listesi yoksa, imlecin READ_ONLY parametresiyle bildirilmesi dışında tüm sütunlar için güncelleme mümkündür.

İmleci açmak ve doldurmak için şu komutu kullanın:

AÇIK ((imleç_adı) I @cursor_variable)

Açıldığında, imleç ada göre (imleç_adı) veya CURSOR (@cursor_variable) türünde bir değişken aracılığıyla belirtilebilir. GLOBAL parametresi, imleç_adı'nın genel bir imleç olduğunu belirtir.

FETCH ifadesi, imleç veri kümesinde hareket etmek ve verileri değişken değerler olarak almak için kullanılır:

GİDİP GETİRMEK[

(( imleç_adı] Ben @cursor_variable]

İmleç boyunca hareketin yönünü belirleyen komutlar Tablo'da açıklanmıştır. 10.10. Daha önce belirtildiği gibi, imlecin türüne bağlı olarak, belirli bir imleç için bazı komutlar uygulanamayabilir.

İmleç henüz açılmışsa, FETCH NEXT'in ilk uygulamasının imleçteki ilk girişe atlayacağını not etmek önemlidir.

Tablo 10.10

İmleç Veri Kümesinde Gezinme

@@FETCH_STATUS global değişkeni, FETCH ifadesinin son yürütmesinin sonucunu bilmenizi sağlar:

О – eylem başarıyla tamamlandı;

  • -1 – ifade yürütme başarısız oldu veya dize sonuç kümesinin sınırlarının dışındaydı (imleç sona erdi);
  • -2 – örneğin, "değişime duyarlı" tip imleç ile çalışma sırasında mevcut kayıt veritabanından silinmişse, seçilebilir bir satır yoktur.

CLOSE ifadesi, veri kümesini depolamak için kullanılan belleği boşaltarak açık bir imleci kapatır. Veri seçmek ve kapalı bir imleç üzerinde hareket etmek mümkün değildir - bunun için yeniden açılması gerekir.

KAPAT (( imleç_adı)|@cursor_variable)

DEALLOCATE ifadesi, bir imleç ile adı veya değişkeni arasındaki ilişkiyi kaldırır. İmleci referans alan soyadı veya değişken ise, imlecin kendisi silinir ve kullandığı tüm kaynaklar serbest bırakılır:

DEALLOCATE (( imleç_adı] | @cursor_variable) 2000'den sonra yayınlanan kitapların yazarlarının ve başlıklarının bir tablodan seçildiği ve verilerin SELECT ifadeleri arasında döngüye girdiği, her seferinde bir kendi başlığı. koddaki yorumlar tarafından verilir:

/*değişkenleri bildiriyor*/

DECLARE @auth varchar(50), @title varchar(50)

NEREDE >= 2000

/*imleci açın ve yazarı ve başlığı ayrı bir SELECT ifadesinde görüntüleyerek "çalıştırın"*/

imleçten @auth, @title İÇİN SONRAKİ AL

WHILESSFETCH_STATUS=0

imleçten @auth, Stitle İÇİN SONRAKİ AL

/* imleci kapatın ve bırakın */

DEALLOCATE imleç

Yukarıda belirtildiği gibi, imleç adı yerine CURSOR türünde bir değişken kullanılabilir. Aşağıda, bu tür değişkenleri kullanan benzer bir kod verilmiştir:

DECLARE Sauth varchar(50), Stitle varchar(50)

/*bir imleç tipi değişken bildiriyor*/

Scurl IMLEÇ BİLDİR

DECLARE imleç CURSOR FAST_FORWARD

dbo.Bookl'DAN Yazar, Başlık SEÇİN

NEREDE >= 2000

/*imleç tipi bir değişkene bir değer atayın*/

SET Scurl = imleç

WHILESSFETCH_STATUS=0

SONRAKİ Scurl'dan Sauth, Stitle'a FETCH