MySQL saklı yordamlarındaki imleçler. MySQL'deki imleçler İmleçler aracılığıyla satırları değiştirme ve silme

Açık bir imleç, bir programın bildirim bölümünde açıkça tanımlanmış bir SELECT komutudur. Açık bir imleç bildirdiğinizde ona bir ad verilir. INSERT, UPDATE, MERGE ve DELETE komutları için açık imleçler tanımlanamaz.

SELECT komutunu açık bir imleç olarak tanımlayarak programcı, Oracle veritabanından bilgi almanın ana aşamaları üzerinde kontrole sahip olur. İmlecin ne zaman açılacağını (OPEN), ne zaman satır seçileceğini (FETCH), kaç satır seçileceğini ve CLOSE komutunu kullanarak imlecin ne zaman kapatılacağını belirler. İmlecin mevcut durumu hakkındaki bilgilere özniteliklerinden ulaşılabilir. Açık imleçleri programcı için paha biçilmez bir araç haline getiren şey, kontrolün bu yüksek ayrıntı düzeyidir.

Bir örneğe bakalım:

1 İŞLEV kıskançlık_düzeyi (2 NAME_IN IN arkadaşlar.NAME%TYPE) NUMARASI 3'Ü 4 OLARAK DÖNÜŞ İMLEÇ kıskançlık_cur 5 IS 6 Arkadaşlardan konum SEÇİN 7 WHERE NAME = UPPER (NAME_IN); 8 8 kıskançlık_rec kıskançlık_cur%ROWTYPE; 9 geri alma numarası; 10 BAŞLANGIÇ 11 AÇIK kıskançlık_cur; 13 12 Kıskançlık_cur'u kıskançlık_rec'E GETİRİN; 15 13 IF kıskançlık_cur%FOUND 14 SONRA 15 IF kıskançlık_rec.location = "PUERTO RICO" 16 THEN retval:= 10; 17 ELSIF kıskançlık_rec.location = "CHICAGO" 18 SONRA retval:= 1; 19 SON İF; 20 IF SONU; 24 21 KAPAT kıskançlık_cur; 26 22 DÖNÜŞ geri dönüşü; 23 İSTİSNA 24 DİĞERLERİ ZAMAN 25 IF kıskançlık_cur%ISOPEN SONRA 26 KAPAT kıskançlık_cur; 27 SON İF; 28 SON;

Sonraki birkaç bölümde bu işlemlerin her biri ayrıntılı olarak tartışılmaktadır. Bunlardaki "imleç" terimi, metin aksini açıkça belirtmediği sürece, açık imleçleri ifade eder.

Açık Bir İmleç Bildirmek

Açık bir imlecin kullanılabilmesi için PL/SQL bloğunun veya paketinin bildirim bölümünde bildirilmesi gerekir:

CURSOR imleç_adı [ ([ parametre [, parametre...]) ] [ RETURN belirtimi_reEirn ] IS SELECT_command ];

Burada imleç adı bildirilen imlecin adıdır; spiifiction_te?it - isteğe bağlı GERİ DÖNÜŞ bölümü; KOMaHdaSELECT - geçerli herhangi bir SQL SELECT komutu. Parametreler ayrıca imlece de aktarılabilir (aşağıdaki “İmleç Parametreleri” bölümüne bakın). Son olarak, SELECT...FOR UPDATE komutundan sonra güncellenecek sütunların listesini belirleyebilirsiniz (ayrıca aşağıya bakın). Bildirimden sonra OPEN komutu ile imleç açılır ve FETCH komutu ile imleçten satırlar alınır.

Açık imleç bildirimlerinin bazı örnekleri.

  • Parametresiz imleç. Bu imleçten elde edilen satır kümesi, tablodaki tüm satırlardan seçilen şirket kimlikleri kümesidir:
CURSOR şirket_cur şirketten şirket_id'sini SEÇİN;
  • Parametreli imleç. Bu imlecin sonuçta ortaya çıkan satır kümesi, iletilen parametrenin değerine karşılık gelen şirket adının bulunduğu tek bir satır içerir:
CURSOR name_cur (şirket_id_in NUMBER) IS SELECT name FROM şirket WHERE şirket_id = şirket_id_in;
  • RETURN cümleciği içeren imleç. Bu imlecin sonuçta ortaya çıkan satır kümesi, departman kimliği 10 için çalışan tablosundaki tüm verileri içerir:
CURSOR emp_cur RETURN Employees%ROWTYPE IS SELECT * FROM Employees WHERE departman_id = 10;

İmleç adı

Açık bir imleç adı en fazla 30 karakter uzunluğunda olmalı ve diğer PL/SQL tanımlayıcılarıyla aynı kurallara uymalıdır. İmleç adı bir değişken değildir; isteğin işaretçisinin tanımlayıcısıdır. İmleç adına bir değer atanmamıştır ve ifadelerde kullanılamaz. İmleç yalnızca OPEN, CLOSE ve FETCH komutlarında ve imleç niteliğini nitelendirmek için kullanılır.

Bir pakette imleç bildirmek

Açık imleçler bir PL/SQL bloğunun bildirim bölümünde bildirilir. Bir imleç paket düzeyinde bildirilebilir ancak belirli bir paket prosedürü veya işlevi içinde bildirilemez. Bir pakette iki imlecin bildirilmesine bir örnek:

PAKET kitap_info İMLEÇTİR titles_cur Kitaplardan başlığı SEÇİN; CURSOR kitaplar_cur (title_filter_in IN kitaplar.title%TYPE) RETURN kitaplar%ROWTYPE IS SELECT * FROM kitaplardan WHERE başlık LIKE title_filter_in; SON;

İlk titles_cur imleci yalnızca kitap başlıklarını döndürür. İkincisi, kitaplar_cur , kitap adlarının imleç parametresi olarak belirtilen kalıpla eşleştiği kitaplar tablosunun tüm satırlarını döndürür (örneğin, "'PL/SQL' dizesini içeren tüm kitaplar"). İkinci imlecin, FETCH komutu tarafından döndürülen veri yapısını bildiren bir RETURN bölümü kullandığını unutmayın.

RETURN bölümü aşağıdaki veri yapılarından herhangi birini içerebilir:

  • %ROWTYPE özniteliği kullanılarak bir veri tablosu satırından tanımlanan bir kayıt.
  • Daha önce bildirilen başka bir imleçten tanımlanan ve yine %rowtype niteliğini kullanan bir giriş.
  • Programcı tanımlı bir giriş.

İmleç seçim listesindeki ifadelerin sayısı, table_name%ROWTYPE, Kypcop%ROWTYPE veya kayıt türü kaydındaki sütun sayısıyla eşleşmelidir. Elemanların veri tipleri de uyumlu olmalıdır. Örneğin, seçim listesinin ikinci elemanı NUMBER türünde ise, RETURN bölümündeki girdinin ikinci sütunu VARCHAR2 veya BOOLEAN türünde olamaz.

RETURN bölümünün ve avantajlarının detaylı incelemesine geçmeden önce, öncelikle bir pakette imleçlerin neden bildirilmesinin gerekli olabileceğini anlayalım. Neden kullanıldığı programda (bir prosedürde, fonksiyonda veya anonim blokta) açık bir imleç bildirmiyorsunuz?

Cevap basit ve ikna edicidir. Bir pakette imleç tanımlayarak, aynı kodu uygulamanın farklı yerlerinde tekrarlamadan, içinde tanımlanan sorguyu yeniden kullanabilirsiniz. Sorgunun tek bir yerde uygulanması, sorgunun değiştirilmesini ve kod bakımını basitleştirir. İşlenen taleplerin sayısı azaltılarak bir miktar zaman tasarrufu sağlanır.

REF CURSOR'a dayalı bir imleç değişkeni döndüren bir işlev oluşturmayı da düşünmeye değer. Çağıran program, satırları bir imleç değişkeni aracılığıyla getirir. Daha fazla bilgi için "İmleç Değişkenleri ve REF İMLEÇ" bölümüne bakın.

Yeniden kullanılabilir paketlerde imleçleri bildirirken dikkate alınması gereken önemli bir nokta vardır. “Paket düzeyinde” (belirli bir işlev veya prosedür içinde değil) bildirilen imleçler dahil tüm veri yapıları, oturum boyunca değerlerini korur. Bu, toplu iş imlecinin siz açıkça kapatana kadar veya oturum bitene kadar açık kalacağı anlamına gelir. Yerel bloklarda bildirilen imleçler, bu bloklar tamamlandığında otomatik olarak kapatılır.

Şimdi GERİ DÖNÜŞ kısmına bakalım. Bir pakette imleç bildirmenin ilginç yanı, imlecin başlığının gövdesinden ayrılabilmesidir. Daha çok bir işlev başlığını anımsatan bu başlık, programcının çalışması için ihtiyaç duyduğu bilgileri içerir: imlecin adı, parametreleri ve döndürülen veri türü. İmlecin gövdesi SELECT komutudur. Bu teknik,book_info paketindeki kitaplar_cur imleç bildiriminin yeni versiyonunda gösterilmiştir:

PAKET kitap_info CURSOR IS kitaplar_cur (title_filter_in IN kitaplar.title%TYPE) RETURN kitaplar%ROWTYPE; SON; PAKET GÖVDE kitap_bilgisi İMLEÇTİR kitaplar_cur (title_filter_in IN kitaplar.title%TYPE) RETURN kitaplar%ROWTYPE IS SELECT * FROM kitaplardan WHERE başlık GİBİ title_filter_in; SON;

IS anahtar sözcüğünden önceki tüm karakterler bir belirtim oluşturur ve IS'den sonra imleç gövdesi gelir. İmleç bildirimini bölmek iki amaca hizmet edebilir.

  • Bilgileri gizleme. Paketteki imleç bir “kara kutudur”. Bu, programcılar için uygundur çünkü SELECT komutunu yazmalarına ve hatta görmelerine gerek yoktur. Bu imlecin hangi kayıtları, hangi sırayla ve hangi sütunları içerdiğini bilmek yeterlidir. Paketle çalışan bir programcı, imleci diğer hazır öğeler gibi kullanır.
  • Minimum yeniden derleme. Sorgu tanımını paketin gövdesinde gizleyerek, paket spesifikasyonunda imleç başlığını değiştirmeden SELECT komutunda değişiklikler yapılabilir. Bu, paket spesifikasyonunun yeniden derlenmesine gerek kalmadan kodun geliştirilmesine, düzeltilmesine ve yeniden derlenmesine olanak tanır; böylece o pakete bağlı programlar geçersiz olarak işaretlenmeyecek ve yeniden derlenmeleri gerekmeyecektir.

Açık Bir İmleci Açma

İmlecin kullanılması, onu bildirimler bölümünde tanımlamakla başlar. Daha sonra bildirilen imlecin açılması gerekir. OPEN ifadesinin sözdizimi çok basittir:

OPEN imleç_adı [ (argüman [, argüman...]) ];

Burada, imleç adı daha önce bildirilen imlecin adıdır ve argüman, bir parametre listesiyle bildirilmişse imlece iletilen değerdir.

Oracle ayrıca, hem imleç değişkenleri ("İmleç Değişkenleri ve REF İMLEÇ" bölümüne bakın) hem de gömülü dinamik SQL için kullanılan bir imleç açılırken FOR sözdizimini destekler.

PL/SQL bir imleci açtığında içerdiği sorguyu çalıştırır. Ek olarak, aktif veri kümesini (sorguya katılan tüm tabloların WHERE kriteri ve birleştirme koşuluyla eşleşen satırları) tanımlar. OPEN komutu veriyi geri getirmez; bu, FETCH komutunun görevidir.

İlk veri getirmenin ne zaman gerçekleştiğine bakılmaksızın Oracle'ın veri bütünlüğü modeli, tüm getirme işlemlerinin verileri imlecin açıldığı durumda döndürmesini sağlar. Yani imlecin açılmasından kapanmasına kadar, ondan veri alınırken bu süre içinde yapılan ekleme, güncelleme ve silme işlemleri tamamen göz ardı edilir.

Ayrıca, SELECT komutu FOR UPDATE bölümü içeriyorsa, imleç açıldığında imleç tarafından tanımlanan tüm satırlar kilitlenir.

Zaten açık olan bir imleci açmaya çalışırsanız, PL/SQL aşağıdaki hata mesajını verecektir:

ORA-06511: PL/SQL: imleç zaten açık

Bu nedenle imleci açmadan önce öznitelik değerini kullanarak durumunu kontrol etmelisiniz. %açık:

EĞER şirket_cur%ISOPEN DEĞİLSE, şirket_cur'u AÇIN; ENDIF;

Açık imleçlerin özellikleri aşağıda onlara ayrılmış bölümde açıklanmıştır.

Bir program bir imleç kullanarak FOR döngüsünü yürütürse, imlecin açıkça açılmasına (getirilmesine, kapatılmasına) gerek yoktur. PL/SQL motoru bunu otomatik olarak yapar.

Açık bir imleçten veri getiriliyor

SELECT komutu sanal bir tablo oluşturur; bu tablo, SELECT sütunlarının bir listesi tarafından tanımlanan sütunlara sahip, WHERE yan tümcesi tarafından tanımlanan bir dizi satırdır. Böylece imleç PL/SQL programında bu tabloyu temsil eder. PL/SQL programlarında imlecin temel amacı işlenecek satırları seçmektir. İmleç satırlarının getirilmesi FETCH komutuyla yapılır:

İmleç_adı kayıt_veya_değişken_listesine FETCH;

Burada imleç adı, kaydın seçildiği imlecin adıdır ve kayıt veya değişken listesi, aktif kayıt kümesinin bir sonraki satırının kopyalandığı PL/SQL veri yapılarıdır. Veriler bir PL/SQL kaydına (%ROWTYPE özniteliğiyle veya TYPE bildirimiyle bildirilir) veya değişkenlere (PL/SQL değişkenleri veya bağlama değişkenleri - Oracle Forms öğelerinde olduğu gibi) yerleştirilebilir.

Açık imleç örnekleri

Aşağıdaki örneklerde verileri örneklemenin farklı yolları gösterilmektedir.

  • Verileri bir imleçten PL/SQL kaydına getirme:
DECLARE CURSOR şirket_cur'u SELECT ...; şirket_rec şirket_cur%ROWTYPE; AÇMAYA BAŞLAYIN şirket_cur; Company_cur INTO Company_rec'e FETCH;
  • Bir imleçten bir değişkene veri getirme:
new_balance_cur'u new_balance_dollars'A GETİRİN;
  • Verileri bir imleçten bir PL/SQL tablo satırına, değişkene ve Oracle Forms bağlama değişkenine getirme:
emp_name_cur INTO emp_name (1), işe alınan kişi, :dept.min_salary;

Bir imleçten getirilen veriler her zaman aynı imlecin altında %ROWTYPE özniteliğiyle bildirilen bir kayda yerleştirilmelidir; Değişken listelerini seçmekten kaçının. Bir kayda getirme, kodu daha kompakt ve esnek hale getirerek FETCH komutunu değiştirmeden getirme listesini değiştirmenize olanak tanır.

Son satırın işlenmesinden sonra örnekleme

İmleci açtığınızda, hepsi bitene kadar satırları tek tek seçersiniz. Ancak bundan sonra yine de FETCH komutunu verebilirsiniz.

İşin garibi, PL/SQL bu durumda bir istisna atmıyor. O sadece hiçbir şey yapmıyor. Seçilecek başka bir şey olmadığından FETCH komutunun INTO kısmındaki değişkenlerin değerleri değişmemektedir. Başka bir deyişle FETCH komutu bu değişkenleri NULL'a ayarlamaz.

Açık imleç sütunu takma adları

İmleç bildirimindeki SELECT ifadesi, döndürdüğü sütunların listesini belirtir. Bu liste, tablo sütun adlarının yanı sıra hesaplanmış veya sanal sütunlar adı verilen ifadeleri içerebilir.

Sütun takma adı, bir sütun veya ifade için SELECT komutunda belirtilen alternatif bir addır. SQL*Plus'ta uygun takma adlar tanımlayarak, rastgele bir sorgunun sonuçlarını insanlar tarafından okunabilir biçimde görüntüleyebilirsiniz. Bu durumlarda takma adlara gerek yoktur. Öte yandan, açık imleçler kullanıldığında aşağıdaki durumlarda hesaplanmış sütun takma adlarına ihtiyaç duyulur:

  • bir imleçten, aynı imlece dayalı olarak %ROWTYPE özniteliğiyle bildirilen bir kayda veri alınırken;
  • bir program hesaplanmış bir sütuna referans içerdiğinde.

Aşağıdaki sorguyu düşünün. SELECT komutu, 2001 yılında mal sipariş eden tüm şirketlerin adlarının yanı sıra toplam sipariş miktarını da seçer (mevcut veritabanı örneği için varsayılan biçimlendirme maskesinin GG-MON-YYYY olduğu varsayılarak):

C şirketinden şirket_adı, SUM (inv_amt) SEÇİN, fatura i NEREDE c.company_id = i.company_id VE i.invoice_date "01-OCAK-2001" VE "31-ARALIK-2001" ARASINDA;

Bu komutu SQL*Plus'ta çalıştırmak aşağıdaki çıktıyı üretecektir:

FİRMA ADI TOPLAM (INV_AMT)
ACME TURBO A.Ş. 1000
WASHINGTON SAÇ CO. 25.20

Gördüğünüz gibi, SUM (INV_AMT) sütun başlığı bir rapor için pek uygun değildir, ancak yalnızca verileri görüntülemek için uygundur. Şimdi aynı sorguyu açık bir imleç kullanarak bir PL/SQL programında çalıştıralım ve bir sütun takma adı ekleyelim:

CURSOR comp_cur SELECT c.name, SUM (inv_amt) total_sales C şirketinden, fatura I NEREDE C.company_id = I.company_id VE I.invoice_date "01-JAN-2001" VE "31-ARALIK-2001" ARASINDADIR; comp_rec comp_cur%ROWTYPE; AÇMAYA BAŞLAYIN comp_cur; comp_cur'U comp_rec'E GETİRİN; SON;

Takma ad olmadan comp_rec kayıt yapısındaki sütuna başvuru yapamam. Bir takma adınız varsa, diğer sorgu sütunlarında olduğu gibi hesaplanmış bir sütunla da çalışabilirsiniz:

IF comp_rec.total_sales > 5000 THEN DBMS_OUTPUT.PUT_LINE (" 5000 $'lık kredi limitinizi " || TO_CHAR (comp_rec.total_sales - 5000, "$9999") kadar aştınız); ENDIF;

%ROWTYPE özniteliğiyle bildirilen bir kayıtta bir satır seçildiğinde, hesaplanan sütuna yalnızca adla erişilebilir; çünkü kaydın yapısı imlecin kendi yapısı tarafından belirlenir.

Açık bir imleci kapatma

Bir zamanlar çocukluğumuzda bize arkamızı temizlememiz öğretildi ve bu alışkanlık (herkes için olmasa da) hayatımızın geri kalanında bizimle kaldı. Bu kuralın programlamada ve özellikle de imleçleri yönetme konusunda son derece önemli bir rol oynadığı ortaya çıktı. Artık ihtiyacınız olmadığında imlecinizi kapatmayı asla unutmayın!

KAPAT komutunun sözdizimi:

KAPAT imleç_adı;

Açık imleçlerin kapatılmasıyla ilgili bazı önemli ipuçları ve dikkat edilmesi gereken noktalar aşağıda verilmiştir.

  • Bir imleç bir prosedürde bildirilir ve açılırsa, işiniz bittiğinde onu kapattığınızdan emin olun; aksi halde kodunuz hafıza sızdıracaktır. Teorik olarak, bir imleç (herhangi bir veri yapısı gibi) kapsam dışına çıktığında otomatik olarak kapatılmalı ve yok edilmelidir. Tipik olarak, bir prosedürden, fonksiyondan veya anonim bloktan çıkarken, PL/SQL aslında içindeki tüm açık imleçleri kapatır. Ancak bu süreç kaynak yoğun olduğundan verimlilik nedeniyle PL/SQL bazen açık imleçlerin tanımlanmasını ve kapatılmasını geciktirir. REF CURSOR türündeki imleçler tanım gereği örtülü olarak kapatılamaz. Emin olabileceğiniz tek şey, "en dıştaki" PL/SQL bloğu tamamlandığında ve kontrol SQL'e veya başka bir çağrı programına geri döndüğünde, PL/SQL'in o blok veya iç içe geçmiş bloklar tarafından açılan tüm imleçleri örtülü olarak kapatacağıdır. . Oracle Technology Network'ün "PL/SQL statik SQL'de imlecin yeniden kullanımı" makalesi, PL/SQL'in imleçleri nasıl ve ne zaman kapattığı konusunda ayrıntılı bir analiz sağlar. İç içe anonim bloklar, PL/SQL'in imleçleri örtülü olarak kapatmadığı bir duruma örnektir. Bu konuyla ilgili bazı ilginç bilgiler için Jonathan Gennick'in “PL/SQL İmleçleri Örtülü Olarak Kapatıyor mu?” makalesine bakın.
  • Bir imleç paket seviyesinde bir pakette bildirilmişse ve bir blokta veya programda açıksa, siz onu açıkça kapatana veya oturum bitene kadar açık kalacaktır. Bu nedenle, toplu düzeydeki imleçle çalışmayı bitirdikten sonra, onu hemen CLOSE komutuyla kapatmalısınız (ve bu arada, istisnalar bölümünde de aynısı yapılmalıdır):
my_package.my_cursor'u AÇMAYA BAŞLAYIN; ... CLOSE imleciyle çalışma my_package.my_cursor; DİĞERLERİ DURUMUNDA İSTİSNA IF mypackage.my_cursor%ISOPEN THEN CLOSE my_package.my_cursor; ENDIF; SON;
  • İmleç yalnızca önceden açıksa kapatılabilir; aksi halde INVALID_CURS0R istisnası atılacaktır. İmleç durumu %ISOPEN özelliği kullanılarak kontrol edilir:
IF şirket_cur%ISOPEN SONRA KAPAT şirket_cur; ENDIF;
  • Programda çok fazla açık imleç kaldıysa imleç sayısı OPEN_CURSORS veritabanı parametresinin değerini aşabilir. Bir hata mesajı alırsanız öncelikle paketlerde bildirilen imleçlerin artık ihtiyaç duyulmadığında kapatıldığından emin olun.

Açık İmleç Nitelikleri

Oracle, açık bir imlecin durumu hakkında bilgi almak için dört özelliği (%FOUND, %NOTFOUND, %ISOPEN, %ROWCOUNTM) destekler. Bir öznitelik referansı aşağıdaki sözdizimine sahiptir: imleç%öznitelik

Burada imleç bildirilen imlecin adıdır.

Açık imleç özniteliklerinin döndürdüğü değerler Tablo'da gösterilmektedir. 1.

Tablo 1. Açık İmleç Nitelikleri

İmleç niteliklerinin, onlarla çeşitli işlemler gerçekleştirmeden önce ve sonra değerleri Tablo'da gösterilmektedir. 2.

Açık imleç nitelikleriyle çalışırken aşağıdakileri göz önünde bulundurun:

  • İmleç açılmadan önce veya kapatıldıktan sonra %FOUND, %NOTFOUND veya %ROWCOUNT özniteliğine erişmeye çalışırsanız, Oracle bir INVALID CURSOR istisnası (ORA-01001) oluşturur.
  • FETCH komutu ilk kez çalıştırıldığında ortaya çıkan satır kümesi boş olur ve imleç öznitelikleri şu değerleri döndürür: %FOUND = FALSE , %NOTFOUND = TRUE ve %ROWCOUNT = 0 .
  • BULK COLLECT kullanıldığında %ROWCOUNT özelliği, verilen koleksiyonlara alınan satır sayısını döndürür.

Tablo 2.İmleç Özellik Değerleri

Operasyon %KURMAK %BULUNAMADI %AÇIK %ROWCOUNT
AÇILMADAN ÖNCE İstisna
ORA-01001
İstisna
ORA-01001
YANLIŞ İstisna
ORA-01001
AÇILDIKTAN sonra HÜKÜMSÜZ HÜKÜMSÜZ DOĞRU 0
İlk FETCH örneğinden önce HÜKÜMSÜZ HÜKÜMSÜZ DOĞRU 0
İlk örnekten sonra
GİDİP GETİRMEK
DOĞRU YANLIŞ DOĞRU 1
Sonrakinden önce
GİDİP GETİRMEK
DOĞRU YANLIŞ DOĞRU 1
Sonraki FETCH'den sonra DOĞRU YANLIŞ DOĞRU Verilere bağlıdır
Son FETCH örneğinden önce DOĞRU YANLIŞ DOĞRU Verilere bağlıdır
Son FETCH örneğinden sonra DOĞRU YANLIŞ DOĞRU Verilere bağlıdır
KAPATMADAN önce YANLIŞ DOĞRU DOĞRU Verilere bağlıdır
Kapandıktan Sonra İstisna İstisna YANLIŞ İstisna

Tüm bu niteliklerin kullanımı aşağıdaki örnekte gösterilmiştir:

Önceki bloglarda prosedür ve fonksiyon parametrelerinin kullanımına ilişkin örnekler defalarca verilmiştir. Parametreler, bir program modülüne ve program modülünden bilgi aktarmanın bir yoludur. Doğru kullanıldığında modülleri daha kullanışlı ve esnek hale getirirler.

PL/SQL, parametreleri imleçlere aktarmanıza olanak tanır. Yazılım modüllerinin parametrelerinin yanı sıra birkaç ek fonksiyonla aynı işlevleri yerine getirirler.

  • İmlecin yeniden kullanım yeteneklerini genişletme. Veri seçimi koşullarını tanımlayan değerleri WHERE yan tümcesine sabit kodlamak yerine, imleç her açıldığında WHERE yan tümcesine yeni değerler aktarmak için parametreleri kullanabilirsiniz.
  • İmleç Kapsamı Sorunlarını Giderme. Sorgu, sabit kodlanmış değerler yerine parametreler kullanıyorsa, elde edilen imleç satırları kümesi belirli bir programa veya blok değişkenine bağlı değildir. Programınızda iç içe geçmiş bloklar varsa, en üst düzeyde bir imleç tanımlayabilir ve bunu, içinde bildirilen değişkenlerle birlikte iç içe geçmiş bloklarda kullanabilirsiniz.

İmleç parametrelerinin sayısı sınırsızdır. OPEN çağrıldığında, imleç için tüm parametreler (varsayılan değerlere sahip olanlar hariç) belirtilmelidir.

Bir imleç ne zaman parametreler gerektirir? Buradaki genel kural prosedürler ve fonksiyonlar için aynıdır: WHERE bölümünde imlecin farklı yerlerde ve farklı değerlerde kullanılması bekleniyorsa buna bir parametre tanımlanmalıdır. İmleçleri parametreli ve parametresiz karşılaştıralım. Parametresiz bir imleç örneği:

İMLEÇ joke_cur Şakalardan adı, kategoriyi, son_kullanılan_tarihi SEÇİN;

İmlecin sonuç kümesi şaka tablosundaki tüm girişleri içerir. Yalnızca belirli bir satır alt kümesine ihtiyacımız varsa sorguya WHERE bölümü eklenir:

CURSOR joke_cur IS SELECT adı, kategori, last_used_date FROM espriler WHERE kategorisi = "KOCA";

Bu görevi gerçekleştirmek için parametreler kullanmadık ve bunlara ihtiyaç da yok. Bu durumda imleç belirli bir kategoriye ait olan tüm satırları döndürür. Peki ya bu imlece her eriştiğinizde kategori değişirse?

Parametreli imleçler

Elbette her kategori için ayrı bir imleç tanımlamayacağız; bu, veriye dayalı uygulama geliştirmenin çalışma şekliyle tamamen tutarsız olacaktır. Yalnızca bir imlece ihtiyacımız var, ancak kategoriyi değiştirebileceğimiz bir imleç - ve yine de gerekli bilgiyi döndürecektir. Ve bu sorunun en iyi (tek olmasa da) çözümü, parametreli bir imleç tanımlamaktır:

PROSEDÜR açıkla_şaka (main_category_in IN şaka_kategorisi.kategori_id%TYPE) IS /* || ||'dan oluşan parametre listesini içeren imleç tek bir dize parametresinden. */ CURSOR joke_cur (category_in IN VARCHAR2) IS SELECT adı, kategori, last_used_date FROM Joke WHERE kategorisi = UPPER (category_in); joke_rec joke_cur%ROWTYPE; BEGIN /* Şimdi, bir imleci açarken ona bir argüman iletilir */ OPEN joke_cur (main_category_in); joke_cur'U joke_rec'E GETİRİN;

İmleç adı ile IS anahtar sözcüğü arasında artık bir parametre listesi bulunmaktadır. WHERE yan tümcesindeki sabit kodlu HUSBAND değeri, UPPER parametresine (category_in) bir referansla değiştirildi. İmleci açtığınızda, değeri HUSBAND, koca veya HuSbAnD olarak ayarlayabilirsiniz; imleç çalışmaya devam edecektir. İmlecin şaka tablosu satırlarını döndürmesi gereken kategorinin adı, OPEN deyiminde (parantez içinde) değişmez değer, sabit veya ifade olarak belirtilir. İmleç açıldığında SELECT komutu ayrıştırılır ve parametre değerle ilişkilendirilir. Daha sonra ortaya çıkan satır kümesi belirlenir ve imleç getirilmeye hazır hale gelir.

Seçeneklerle birlikte bir imlecin açılması

Herhangi bir kategoriyi belirten yeni bir imleç açılabilir:

OPEN joke_cur(Jokes_pkg.category); OPEN joke_cur("koca"); OPEN joke_cur("politikacı"); AÇIK joke_cur (Jokes_pkg.relation || "-IN-LAW");

İmleç parametreleri çoğunlukla WHERE yan tümcesinde kullanılır, ancak bunlara SELECT ifadesinin başka bir yerinde başvurulabilir:

İMLECİ BİLDİRİN joke_cur (ARCHAR2'DE kategori_in) IS SELECT adı, kategori_in, last_used_date FROM şaka WHERE kategorisi = UPPER (kategori_in);

Kategoriyi tablodan okumak yerine, kategori_in parametresini seçim listesine koyarız. WHERE yan tümcesi örnek kategoriyi parametre değeriyle sınırladığından sonuç aynı kalır.

İmleç parametre kapsamı

Bir imleç parametresinin kapsamı o imleçle sınırlıdır. Bir imleç parametresine, imleçle ilişkili SELECT komutunun dışında başvurulamaz. Aşağıdaki PL/SQL kod parçacığı derlenmiyor çünkü program_adı blokta yerel bir değişken değil. Bu, yalnızca imlecin içinde tanımlanan resmi bir imleç parametresidir:

İMLECİ BELİRTİN Scariness_cur (program_adı VARCHAR2) IS SELECT SUM (korkunç_düzey) total_scary_level FROM tales_from_the_crypt WHERE prog_name = program_name; BEGIN program_adı:= "NEFES ALAN MUMYA"; /* Geçersiz bağlantı */ OPEN Scariness_cur (program_adı); .... KAPAT Scariness_cur; SON;

İmleç Parametre Modları

İmleç parametrelerinin sözdizimi, prosedür ve işlevlerinkine çok benzer; tek fark, imleç parametrelerinin yalnızca IN parametreleri olabilmesidir. İmleç parametreleri OUT veya IN OUT modlarına ayarlanamaz. Bu modlar, değerlerin prosedürlerden iletilmesine ve döndürülmesine izin verir, bu da imleç için hiçbir anlam ifade etmez. İmleçten bilgi almanın tek bir yolu vardır: Bir kaydı getirmek ve INTO bölümündeki sütun listesinden değerleri kopyalamak

Varsayılan Parametre Değerleri

İmleç parametrelerine varsayılan değerler atanabilir. Varsayılan parametre değerine sahip bir imleç örneği:

CURSOR emp_cur (emp_id_in NUMBER:= 0) IS SELECT çalışan_id, emp_name FROM çalışan WHERE çalışan_id = emp_id_in;

emp_id_in parametresinin varsayılan bir değeri olduğundan, FETCH komutunda atlanabilir. Bu durumda imleç çalışan hakkındaki bilgileri 0 koduyla döndürecektir.

Bugün pek çok ilginç şeye bakacağız, örneğin, parametreleri toplu olarak kabul eden önceden oluşturulmuş bir prosedürün nasıl başlatılacağı, yani. sadece statik parametrelerle değil, örneğin normal bir fonksiyon gibi bazı tablolara göre değişecek parametrelerle ve bize tam olarak bu konuda yardımcı olacaklar imleçler ve döngüler ve şimdi tüm bunları nasıl uygulayacağımıza bakacağız.

Anladığınız gibi, belirli bir görev için geçerli olan imleçleri ve döngüleri ele alacağız. Şimdi size görevin ne olduğunu anlatacağım.

Hesaplamalar ve bu hesaplamalara dayalı olarak ekleme gibi normal bir SQL fonksiyonunun yapamayacağı bazı şeyleri yapan bir prosedür vardır. Ve onu örneğin şu şekilde başlatırsınız:

EXEC test_PROCEDURE par1, par2

Başka bir deyişle, yalnızca belirtilen parametrelerle çalıştırırsınız, ancak bu prosedürü örneğin 100, 200 veya daha fazla kez çalıştırmanız gerekiyorsa, bunun pek uygun olmadığını kabul edeceksiniz, yani. uzun zamandır. Prosedürü bir seçme sorgusunda normal bir fonksiyon gibi çalıştırsaydık çok daha kolay olurdu:

test_table'dan my_fun(id)'yi SEÇİN

Yani fonksiyon test_table tablosunun her kaydı için çalışacak ancak bildiğiniz gibi prosedür bu şekilde kullanılamaz. Ancak planımıza ulaşmamıza yardımcı olacak bir yol, hatta iki yol var: birincisi bir imleç ve bir döngü kullanmak, ikincisi ise sadece bir döngü kullanmak, ancak imleç olmadan. Her iki seçenek de daha sonra başlatacağımız ek bir prosedür oluşturacağımızı ima ediyor.

Not! Tüm örnekleri MSSql 2008 DBMS'ye Management Studio kullanarak yazacağız. Ayrıca, aşağıda listelenen eylemlerin tümü, SQL'de veya daha doğrusu Transact-SQL'de programlamada gerekli bilgiyi gerektirir. Aşağıdaki materyali okuyarak başlamanızı tavsiye edebilirim:

O halde başlayalım ve prosedürü yazmadan önce örneğimizin kaynak verilerine bakalım.

Diyelim ki bir test_table tablosu var

TABLO OLUŞTUR .( (18, 0) NULL, (50) NULL, (50) NULL) ON GO

Prosedürün gerçekleştireceği bazı hesaplamalara dayanarak içine veri eklemek gerekir. my_proc_test, bu durumda sadece veri ekler, ancak pratikte birçok hesaplama yapabilen kendi prosedürünüzü kullanabilirsiniz, dolayısıyla bizim durumumuzda bu özel prosedür önemli değil, sadece bir örnektir. Peki, onu oluşturalım:

PROSEDÜR OLUŞTURUN. (@number numeric, @pole1 varchar(50), @pole2 varchar(50)) BAŞLADIĞINDA INSERT INTO dbo.test_table (number, pole1, pole2) DEĞERLER (@number, @pole1, @pole2) SON GİT

Basitçe üç parametre alır ve bunları tabloya ekler.

Ve diyelim ki bu işlemi, bazı tablo veya görünümlerde (VIEWS) satır sayısı kadar çalıştırmamız, yani her kaynak satır için toplu olarak çalıştırmamız gerekiyor.

Mesela şöyle bir kaynak oluşturalım, basit bir tablomuz olacak test_table_time, ancak sizin için kaynağımı daha önce söylediğim gibi, örneğin geçici bir tablo veya görünüm olabilir:

TABLO OLUŞTUR .( (18, 0) NULL, (50) NULL, (50) NULL) ON GO

Bunu test verileriyle dolduralım:

Ve şimdi prosedürümüzün her satır için çalıştırılması gerekiyor, yani. farklı parametrelerle üç kez. Anladığınız gibi bu alanların değerleri bizim parametrelerimizdir, yani prosedürümüzü manuel olarak çalıştırsaydık şöyle görünürdü:

exec my_proc_test 1, 'pole1_str1', 'pole2_str1'

Ve böylece uygun parametrelerle üç kez daha.

Ancak bunu yapmak istemiyoruz, bu yüzden ana prosedürümüzü ihtiyaç duyduğumuz sayıda çalıştıracak başka bir ek prosedür yazacağız.

İlk seçenek.

Bir prosedürde imleç ve döngü kullanma

Doğrudan konuya geçelim ve prosedürü yazalım ( my_proc_test_all), kodu her zamanki gibi yorumladım:

PROSEDÜR OLUŞTURUN. AS --declare değişkenleri DECLARE @number bigint DECLARE @pole1 varchar(50) DECLARE @pole2 varchar(50) --declare a imleç DECLARE my_cur SEÇİM numarası, pole1, pole2 İÇİN İMLEÇ test_table_vrem'DEN --imleci aç my_cur'u aç --read değişkenlerimize ilk satırların verilerini FETCH NEXT FROM my_cur INTO @number, @pole1, @pole2 --eğer imleçte veri varsa, o zaman bir döngüye girin --ve içinde başka satır kalmayıncaya kadar orada döndürün imleç WHILE @@FETCH_STATUS = 0 BEGIN --döngünün her yinelemesi için, ana prosedürümüzü gerekli parametrelerle başlatırız exec dbo.my_proc_test @number, @pole1, @pole2 --imlecin sonraki satırını oku FETCH NEXT FROM my_cur INTO @number, @kutup1, @kutup2 END --imleci kapat KAPAT my_cur DEALLOCATE my_cur GO

Şimdi tek yapmamız gereken onu çağırmak ve sonucu kontrol etmek:

SELECT * FROM test_table prosedürü yürütülmeden önce -- EXEC prosedürünü çağırın dbo.my_proc_test_all -- SELECT * FROM test_table prosedürü yürütüldükten sonra

Gördüğünüz gibi her şey olması gerektiği gibi çalıştı, başka bir deyişle my_proc_test prosedürü üç kez de çalıştı ve ek prosedürü yalnızca bir kez çalıştırdık.

İkinci seçenek.

Prosedürde sadece bir döngü kullanıyoruz

Bunun geçici tablodaki satır numaralandırmasını gerektirdiğini hemen söyleyeceğim; Her satır numaralandırılmalıdır, örneğin 1, 2, 3; geçici tablomuzda bu alan sayıdır.

Bir prosedür yazma my_proc_test_all_v2

PROSEDÜR OLUŞTURUN. AS --declare değişkenleri DECLARE @number bigint DECLARE @pole1 varchar(50) DECLARE @pole2 varchar(50) DECLARE @cnt int DECLARE @i int --geçici tablodaki satır sayısını öğrenin SELECT @cnt=count(* ) FROM test_table_vrem - -tanımlayıcının başlangıç ​​değerini ayarlayın SET @i=1 WHILE @cnt >= @i BEGIN --parametrelerimize değerler atayın SELECT @number=number, @pole1= pole1, @pole2=pole2 FROM test_table_vrem NEREDE sayı = @I --döngünün her yinelemesi için, ana prosedürümüzü gerekli parametrelerle başlatırız EXEC dbo.my_proc_test @number, @pole1, @pole2 --adım setini artırın @i= @i+1 END GİTMEK

Ve sonucu kontrol ediyoruz, ancak önce my_proc_test_all prosedürünü kullanarak doldurduğumuz için tablomuzu temizleyeceğiz:

Tabloyu temizleyin DELETE test_table --SELECT * FROM test_table prosedürünü yürütmeden önce --EXEC prosedürünü çağırma dbo.my_proc_test_all_v2 --SELECT * FROM test_table prosedürünü yürüttükten sonra

Beklendiği gibi sonuç aynıdır ancak imleçler kullanılmaz. Hangi seçeneği kullanacağınıza karar vermek size kalmış, ilk seçenek iyidir çünkü prensip olarak numaralandırmaya gerek yoktur, ancak bildiğiniz gibi imleçte çok fazla satır varsa imleçler oldukça uzun süre çalışır ve ikinci seçenek iyi çünkü bana öyle geliyor ki daha hızlı çalışacak, yine çok fazla satır varsa, ancak numaralandırma gerekiyorsa, kişisel olarak imleçli seçeneği seviyorum, ancak genel olarak bu size kalmış, yapabilirsiniz daha uygun bir şey bulun, az önce görevi nasıl uygulayabileceğinizin temellerini gösterdim. İyi şanlar!

Çok sayıda yorum aldım. Bunlardan birinde bir okuyucum, saklı yordamların önemli unsurlarından biri olan imleçlere daha fazla dikkat etmemi istedi.

İmleçler saklı yordamın parçası olduğundan bu makalede HP'ye daha ayrıntılı olarak bakacağız. Özellikle HP'den bir veri kümesinin nasıl çıkarılacağı.

İmleç nedir?

MySQL'de imleç tek başına kullanılamaz. Saklı prosedürlerin önemli bir bileşenidir. Bir imleci C/C++'daki bir "işaretçiyle" veya PHP foreach ifadesindeki bir yineleyiciyle karşılaştırırdım.

Bir imleç kullanarak bir veri kümesinde yinelenebilir ve her kaydı belirli görevlere göre işleyebiliriz.

Bu kayıt işleme işlemi aynı zamanda PHP katmanında da yapılabilir; bu, işlenen özeti/istatistiksel sonucu basitçe geri döndürebildiğimiz için PHP katmanına aktarılan veri miktarını önemli ölçüde azaltır (böylece istemci tarafında select - foreach işlemini ortadan kaldırır) .

İmleç saklı bir prosedürde uygulandığından, HP'nin doğasında olan tüm avantajlara (ve dezavantajlara) sahiptir (erişim kontrolü, ön derleme, hata ayıklama zorluğu, vb.)

İmleçlerle ilgili resmi belgeleri burada bulabilirsiniz. İmleç bildirimi, açma, kapatma ve geri alma ile ilgili dört komutu açıklar. Bahsedildiği gibi, diğer bazı saklı yordam ifadelerini de ele alacağız. Başlayalım.

Pratik uygulama örneği

Kişisel web sitemde favori NBA takımım Lakers'ın maç sonuçlarını içeren bir sayfa var.

Bu sayfanın tablo yapısı oldukça basittir:

Şekil 1. Lakers maç sonuçları tablosunun yapısı

2008 yılından bu yana bu tabloyu dolduruyorum. 2013-14 sezonundaki en son Lakers maç sonuçlarından bazıları aşağıdadır:

Pirinç. 2. 2013-2014 sezonundaki Lakers maçlarının (kısmi) sonuç tablosu

(MySQL veritabanını yönetmek için MySQL Workbench'i GUI aracı olarak kullanıyorum. Siz istediğiniz başka bir aracı kullanabilirsiniz).

Lakers basketbolcularının son zamanlarda pek iyi oynamadığını itiraf etmeliyim. 15 Ocak itibarıyla üst üste 6 yenilgi. Bunları tanımladım" Üst üste 6 yenilgi", geçerli tarihten başlayarak (ve daha önceki oyunlara kadar) art arda kaç maçın "L" (mağlubiyet) kazanma-kaybetme değerine sahip olduğunu manuel olarak sayarak.

Bu kesinlikle imkansız bir iş değil, ancak koşullar daha karmaşık hale gelirse ve veri tablosu çok daha büyük olursa, o zaman daha uzun sürecek ve hata olasılığı da artacaktır.

Aynısını tek bir SQL ifadesiyle yapabilir miyiz? SQL uzmanı değilim, dolayısıyla istenen sonuca nasıl ulaşacağımı çözemedim (" Üst üste 6 yenilgi") tek bir SQL ifadesi aracılığıyla. Gurunun görüşleri benim için çok değerli olacak; bunları aşağıdaki yorumlara bırakın.

Bunu PHP ile yapabilir miyiz? Evet elbette. O sezona ait oyun verilerini (özellikle galibiyet/mağlubiyet sütunu) alabilir ve mevcut galibiyet/mağlubiyet serisinin uzunluğunu hesaplamak için kayıtları yineleyebiliriz.

Ancak bunu yapmak için o yıla ait tüm verileri toplamamız gerekir ve verilerin çoğu bizim için işe yaramaz (herhangi bir takımın arka arkaya 20'den fazla oyundan daha uzun bir galibiyet serisine sahip olması pek olası değildir) 82 maçlık normal sezon).

Ancak bir seriyi belirlemek için PHP'de kaç kaydın alınması gerektiğini kesin olarak bilmiyoruz. Dolayısıyla gereksiz verileri gereksiz yere çıkarmadan yapamayız. Ve son olarak, eğer bu tablodan bilmek istediğimiz tek şey art arda elde edilen kazanç/mağlubiyet sayısı ise, neden tüm veri satırlarını çıkarmamız gerekiyor?

Bunu başka bir şekilde yapabilir miyiz? Evet mümkün. Örneğin, galibiyet/mağlubiyet sayısının mevcut değerini arka arkaya saklamak için özel olarak tasarlanmış bir yedekleme tablosu oluşturabiliriz.

Her yeni kaydın eklenmesi bu tabloyu otomatik olarak güncelleyecektir. Ancak bu çok hantal ve hataya açık bir işlemdir.

Peki bunu nasıl daha iyi yapabiliriz?

Saklı yordamda imleç kullanma

Bu makalenin başlığından da tahmin edebileceğiniz gibi, (bence) bu sorunu çözmenin en iyi alternatifi, saklı yordamda bir imleç kullanmaktır.

MySQL Workbench'te ilk HP'yi oluşturalım:

DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROSEDÜR `çizgi`(in cur_year int, out longstreak int, out status char(1)) BEGIN deklare current_win char(1); current_streak int'yi bildir; current_status char(1)'i bildirin; Lakers'tan kazanılanları seçmek için kür imlecini bildirin; burada yıl=cur_year ve kazanılan kayıp<>"" kimlik açıklamasına göre sırala; current_streak=0'ı ayarla; açık cur; cur'u current_win'e getir; current_streak'i ayarla = current_streak +1; start_loop: döngü cur'u current_status'a getirir; eğer geçerli_durum<>current_win sonra start_loop'tan ayrıl; aksi takdirde current_streak=current_streak+1'i ayarlayın; eğer biterse; son döngü; yakın cur; en uzun çizgiye current_streak'i seçin; 'durum'a current_win'i seçin; SON

Bu HP'de bir gelen parametremiz ve iki giden parametremiz var. Bu, HP imzasını tanımlar.

HP'nin bünyesinde ayrıca, belirli bir maçın sonuç serisi (galibiyet veya mağlubiyet, mevcut_kazanç), mevcut seri ve mevcut galibiyet/mağlubiyet durumu için çeşitli yerel değişkenler de beyan ettik:

Bu satır imlecin bildirimidir. Cur adında bir imleç ve bu imleçle ilişkili, bu maçlar için kazanma/kaybetme durumu olan bir dizi veri tanımladık (kazanma sütununun değeri "W" veya "L" olabilir, ancak boş olamaz) kimliğe göre sıralanan belirli bir yıl (son oynanan oyunların kimliği daha yüksek olacaktır) azalan sırada.

Görünmese de bu veri setinin "L" ve "W" değerlerinden oluşan bir dizi içereceğini hayal edebiliriz. Şekil 2'de gösterilen verilere göre şu şekilde olmalıdır: “LLLLLLWLL...” (6 değer “L", 1 “W” vb.)

Art arda galibiyet/mağlubiyet sayısını hesaplamak için son (ve verilen veri kümesindeki ilk) maçla başlarız. Bir imleç açıldığında her zaman karşılık gelen veri kümesindeki ilk kayıtla başlar.

İlk veri yüklendikten sonra imleç bir sonraki kayda geçer. Bu nedenle, imlecin davranışı, FIFO (İlk Giren İlk Çıkar) sistemini kullanarak bir veri kümesi boyunca yinelenen bir kuyruğa benzer. Bu tam olarak ihtiyacımız olan şey.

Mevcut kazanma/kaybetme durumunu ve kümedeki ardışık özdeş öğelerin sayısını aldıktan sonra, veri kümesinin geri kalanında döngü yapmaya devam ederiz. Döngünün her yinelemesinde, biz döngüyü kırana veya tüm kayıtlar yinelenene kadar imleç bir sonraki kayda "atlayacaktır".

Bir sonraki kaydın durumu mevcut ardışık galibiyet/mağlubiyet seti ile aynıysa, bu serinin devam ettiği anlamına gelir, o zaman ardışık galibiyet (veya mağlubiyet) sayısını bir 1 daha artırırız ve veriler arasında döngü yapmaya devam ederiz.

Durum farklıysa seri bozuldu ve döngüyü durdurabiliriz demektir. Son olarak imleci kapatıyoruz ve orijinal verileri bırakıyoruz. Bundan sonra sonuç görüntülenir.

Bu HP'nin çalışmasını test etmek için kısa bir PHP betiği yazabiliriz:

exec("çağrı serisi(2013, @en uzun seri, @durum)"); $res=$cn->query("select @longeststreak, @status")->fetchAll(); var_dump($res); //Çıktının ham görünümünü elde etmek için çıktıyı buraya dökün $win=$res["@status"]="L"?"Loss":"Win"; $streak=$res["@longeststreak"]; echo "Lakers şu anda art arda $galibiyet serisine sahip.n";

İşleme sonucu aşağıdaki şekle benzemelidir:

Saklı bir prosedürden veri kümesinin çıktısını alma

Bu makale boyunca birçok kez, başka bir HP'ye yapılan ardışık çağrıların işlenmesinin sonuçlarından elde edilen bir veri kümesini oluşturan bir HP'den bir dizi verinin nasıl elde edileceğiyle ilgili konuşmalar yapıldı.

Kullanıcı, daha önce oluşturduğumuz HP'yi kullanarak yıl boyunca sürekli bir kazanç/kayıp serisinden daha fazla bilgi edinmek isteyebilir; örneğin, farklı yıllara ait galibiyet/mağlubiyet serilerini görüntüleyecek bir tablo oluşturabiliriz:

YIL Kazan kaybet Rüzgâr gibi geçmek
2013 L 6
2012 L 4
2011 L 2

(Prensip olarak, belirli bir sezondaki en uzun galibiyet veya mağlubiyet serisinin süresi daha yararlı bilgi olacaktır. Bu sorunu çözmek için açıklanan HP'yi kolayca genişletebilirsiniz, bu nedenle bu görevi ilgilenen okuyuculara bırakacağım. Mevcut makale çerçevesinde mevcut galibiyet/mağlubiyet serisini işlemeye devam edeceğiz).

MySQL saklı yordamları, select ... from ... ifadelerinden farklı olarak yalnızca skaler değerleri (tamsayı, dize vb.) döndürebilir (sonuçlar bir veri kümesine dönüştürülür). Sorun, sonuçları almak istediğimiz tablonun mevcut veritabanı yapısında bulunmaması, saklı yordamın işlenmesinin sonuçlarından derlenmesidir.

Bu sorunu çözmek için geçici bir tabloya veya mümkünse ve gerekliyse bir yedek tabloya ihtiyacımız var. Geçici bir tablo kullanarak elimizdeki sorunu nasıl çözebileceğimizi görelim.

İlk önce kodu aşağıda gösterilen ikinci bir HP oluşturacağız:

DELIMITER $$ CREATE DEFINER=`root`@`%` PROSEDÜR `yıllık_streak`() begin cur_year, max_year, min_year int'yi beyan eder; lakers'tan max_year, min_year'a max(year), min(year)'ı seçin; EĞER VARSA GEÇİCİ TABLOYU DÜŞÜRÜN yıllık_streak; GEÇİCİ TABLO OLUŞTURUN yıllık_seri (sezon int, seri int, galibiyet char(1)); cur_year=max_year'ı ayarlayın; yıl_döngü: eğer döngü_yıl ise döngü

Yukarıdaki kodla ilgili birkaç önemli not:

  1. Lakers tablosundan numune için en erken ve en geç yılı belirliyoruz;
  2. Giden verileri gerekli yapıyla (sezon, galibiyet serisi, galibiyet) depolamak için geçici bir tablo oluşturuyoruz;
  3. Döngüde, önce önceden oluşturulan HP'yi gerekli parametrelerle (çağrı çizgisi(cur_year, @l, @s);) çalıştırırız, ardından döndürülen verileri yakalar ve geçici bir tabloya ekleriz ( yıllık_streak değerlerine ekleyin (cur_year, @l, @s););
  4. Son olarak geçici tablodan seçim yapıp veri setini döndürüyoruz ve ardından bazı kurulumlar yapıyoruz ( EĞER VARSA GEÇİCİ TABLOYU DÜŞÜRÜN yıllık_streak;).

Sonuçları elde etmek için, kodu aşağıda gösterilen başka bir küçük PHP betiği oluşturuyoruz:

query("yıllık_streak'i ara")->fetchAll(); foreach ($res as $r) ( echo sprintf("%d yılında, en uzun W/L serisi %d %sn", $r["sezon"], $r["streak"], $r[ "kazanç"]); )

Görüntülenen sonuçlar şuna benzer:

İ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 genellikle prosedürel dillerde yazılmış uygulama programlarına gömülü SQL ifadelerinde kullanılır. 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 seçeneğinin 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üşterilerin Moskova'dan satın aldığı malların listesini ve bunların toplam maliyetini görüntülemek için bir 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)) NEREDE klient_cursor'UN GÜNCELLEMESİ SELECT @message="İstemci "+@fam+" Firma "+ @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 (ü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

İmleç SQL'de, veritabanı belleğinde son SQL ifadesinin saklanmasına ayrılmış bir alan. Geçerli ifade bir veritabanı sorgusuysa, geçerli değer veya geçerli satır adı verilen bir dizi sorgu verisi de bellekte saklanır. imleç. Bellekte belirtilen alan adlandırılır ve uygulama programları tarafından erişilebilir.

İle çalışırken SQL standardına göre imleçler aşağıdaki ana olanlar tanımlanabilir hareketler:

  • yaratılış veya imleç bildirimi ;
  • imleci açma, onlar. çok seviyeli hafızada saklanan verilerle doldurulması;
  • imleçten seçim Ve değiştirmek veri hatlarını kullanarak;
  • imleci kapatma bundan sonra kullanıcı programları tarafından erişilemez hale gelir;
  • imleci serbest bırakma yani silme imleç bir nesne olarak çünkü kapanış kendisiyle ilişkili belleği mutlaka boşaltmaz.

SQL Server üçünü destekler imleç türü:

  • imleçler SQL öncelikle tetikleyiciler, saklı yordamlar ve komut dosyaları içinde kullanılır;
  • imleçler sunucular sunucu üzerinde hareket eder ve ODBC, OLE DB, DB_Library için uygulama programlama arayüzünü uygular;
  • imleçler istemci istemcinin kendisi üzerinde 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.

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 değiştirmek imleç kullanılarak veri satırları;
  • KAPALI - imleci kapatma ;
  • DAĞITIM – imleci serbest bırakma yani İmlecin bir nesne olarak silinmesi.

İmleç Bildirimi

Oluşturmak için SQL standardında imleç Aşağıdaki komut sağlanır:

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

INSENSITIVE anahtar sözcüğünü kullanmak şunu yaratacaktır: statik imleç. Veri değişiklikleri izin verilmiyor, ayrıca görüntülenmiyor değişiklikler, diğer kullanıcılar tarafından yapılmıştır. 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 komutu uygulamanıza olanak tanır örnekler. Bu argüman atlanırsa, o zaman imleççıkıyor tutarlı yani görüntülemesi baştan sona yalnızca tek yönde mümkün olacaktır.

SELECT ifadesi, satırların sonuç kümesini belirleyen SELECT sorgusunun gövdesini belirtir. imleç.

FOR READ_ONLY bağımsız değişkeninin belirtilmesi şunu oluşturur: imleç"salt okunur"dur ve verilerde hiçbir değişiklik yapılmasına izin verilmez. Bu farklı statik, ancak ikincisi de verileri değiştirmenize izin vermiyor. Salt okunur imleç olarak bildirilebilir dinamik imleç görüntülemenizi sağlayacak değişiklikler, başka bir kullanıcı tarafından yapılmıştır.

Yaratılış imleç FOR UPDATE argümanı ile yürütmenize olanak sağlar imleç 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, oluşturma komutu için aşağıdaki sözdizimi kabul edilir imleç:

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

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

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

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

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ç.

Eğer için imleç READ_ONLY, daha sonra oluşturulan FAST_FORWARD bağımsız değişkenini belirtin 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.

İÇİNDE imleç OPTIMISTIC argümanıyla oluşturulan içerik yasaktır değiştirmek Ve satırlar siliniyor bunlar daha sonra değiştirildi imleci açma.

TYPE_WARNING argümanını belirtirken, sunucu kullanıcıyı örtülü tür değişikliği konusunda bilgilendirecektir. imleç SELECT sorgusuyla uyumlu değilse.

İmleci açma

İçin imleci açma ve oluşturma sırasında belirtilen verilerle doldurulması imleç SELECT sorgusu aşağıdaki komutu kullanır:

AÇ ((imleç_adı) |@imleç_değişken_adı)

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:

FETCH [ FROM ]((imleç_adı)| @imleç_değişken_adı) ]

İLK belirtilmesi tüm sonuç kümesinin ilk satırını döndürecektir imleç, geçerli satır olur.

LAST belirtilmesi en son satırı döndürür imleç. 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. FETCH komutu varsayılan olarak bu yöntemi kullanır. örneklerçizgiler.

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

ABSOLUTE (satır_numarası | @satır_numarası_değişken), tam sonuç kümesindeki satırı mutlak dizin numarasına göre döndürür imleç. 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.

RELATIVE argümanı (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. İsim imleç bir değişken kullanılarak da belirtilebilir.

INTO @değişken_adı [,...n] yapısı, döndürülen dizenin karşılık gelen sütun değerlerinin saklanacağı değişkenlerin bir listesini belirtir. Değişkenlerin sırası sütunların sırasına uygun olmalıdır. imleç ve değişkenin veri türü sütundaki veri türüdür imleç. INTO yapısı belirtilmezse, FETCH komutunun davranışı SELECT komutunun davranışına benzeyecektir - veriler ekranda görüntülenir.

Fok
Konunun devamı:
Android

Lamoda.ru, tüm aileye kıyafet ve ayakkabı satışı için en büyük çevrimiçi platformlardan biridir. Yüzlerce küresel markanın 250.000'den fazla ürünü arasında müşteriler,...