internet pencereler Android
Genişletmek

Transact-SQL'de imleç ve döngüleri kullanın. SQL Server'da MySQL İmlecilerinde İmleçler

1) İmleç Kavramı
İnteraktif SQL'de, tek hatlı ve çok satır istekleri değişmez. Gömülü SQL'de bu talepler farklı şekillerde gerçekleştirilir. Tek zamanlı sorgular bir satır döndürür ve çoktan düşündük. Sorgunun yürütülmesinin bir sonucu bir satır olmadığında, gömülü SQL, sorgu sonuçlarının doğrusal alınması olasılığı ile bir uygulama sağlamalıdır. Bunun için imleçler kullanılır. İmleç altında istek ile ilişkili bir değişken anlamına gelir. Değeri, talebi tatmin eden her dizedir. Değişkenler gibi, imleçler kullanmadan önce tarif edilmelidir. Görünümlerin aksine, imleçler çizmek için tasarlanmıştır.

2) İmleç duyurusu

Bildirmek. [{}] [[Hayır.] Kaydırma] İmleç. [{| Olmadan |.} Ambar.] İçin [İçin {Salt okunur | güncelleme [Nın-nin. ]}]

3) Anahtar Kelimeler
. Hassas | duyarsız | Asansitif - Sonuçtaki setteki değişiklikler görünür | Yasaklanır (veri setinin bir kopyası kullanılarak düzeltilir) | DBMS'nin kendisi bir kopya yapmaya karar verir (varsayılan olarak gerçek).
. İle | tutulmadan - Açık Yapraklar | Taahhüt operatörü bir araya geldiyse imleci kapatır.
. Kaydırma - [yasaklar] Sonuç çizgilerini keyfi bir sırayla çıkarmak için.
. Sadece okumak için - İmleci yalnızca okumak için belirler.
. Güncelleme için. - Yalnızca belirtilen sütunlar güncellemeden engelleniyor.

4) SQL Server'da İmleç Duyuru

Bildirmek. İmleç. [Yerel | küresel] [İleri_only | kaydırma] [Statik | keyset | dinamik | fast_forward] [Read_only | scroll_locks | iyimser] İçin [Güncelleme için. [Nın-nin. ]]

. Statik. - İmleci kullanmak için verilerin geçici bir kopyasını oluşturan imleci belirtir. Tüm imleç talepleri, TEMPDB veritabanındaki belirtilen geçici tabloya bakılır, bu nedenle baz tablolarını değiştirmek, bu imleç için numuneler tarafından geri dönen verileri etkilemez ve imleçin kendisi değişikliklere izin vermez.
. Anahtar seti. - İmlecin içindeki üyeliğin veya dizgelerin siparişlerinin açılmasından sonra değişmediğini gösterir. Dizeleri açıkça tanımlayan bir dizi anahtar, Keyset adlı tempdb veritabanında bir tabloya yerleştirilmiştir.
. Dinamik - Bu imleci görüntülerken, ok kadrosu dizelerinde yapılan tüm veri değişikliklerini gösteren imleci belirtir. Veri değerleri, sipariş, ayrıca her numunedeki satır üyeliği değişebilir. Mutlak örnekleme parametresi dinamik imleçler tarafından desteklenmiyor.
. İleri sar - Performans optimizasyonunun etkinleştirildiği ileri_only imlecini, Read_only'i belirtir. Fast_forward parametresi, kaydırma veya for_update parametreleri ile belirtilemez.
. Scroll_locks. - İmleç aracılığıyla yapılan güncellemelerin veya sökülmenin başarılı olması garanti edileceğini gösterir. SQL Server, İmleci, sonraki değişiklikler için kullanılabilirliklerini sağlamak için okunurken dizeleri engeller. Scroll_locks parametresi, Fast_forward veya statik parametre ile belirtilemez.
. İyimser - İmleci okumadan bu yana dize güncellendiğinde, imleç aracılığıyla yapılan konumlandırılmış güncellemelerin veya silinmelerin yapılması gerektiğini gösterir. SQL Server, ipleri imlecin içine okurken engellemez. Bunun yerine, İmleci okuduktan sonra dize değişip değişmediğini belirlemek için, zaman damgası sütun değerleri karşılaştırılır (veya bir TIMESP sütunu yoksa kontroller). Dize değiştirilmişse, konumlandırılmış değişikliği veya kaldırılması mümkün değildir. İyimser parametre, Fast_forward parametresiyle belirtilemez.

5) açılış imleci

6) İmleçten satırların çıkarılması

Almak [{Sonraki | Önceki | İlk | Son|{Mutlak | akraba. }}]
Dan. İçine

7) İmleç Konumlandırma Seçenekleri
. Sonraki | Önceki | İlk | Son - Sonraki | Önceki | İlk | Sonuçtaki setin son dizisi.
. Göreceli ± N. - Geçerli çizgiye göre pozitif veya negatif ofset içeren bir dizede.
. Mutlak ± N. - İmlecin başlangıcından veya sonundan açıkça belirtilen mutlak sayıda pozisyon içeren bir dizede.

Not: SQL Server'da, N yerine, bir tamsayı değişkeni (@n) izin verilir.

8) Kapanış İmleci

9) İmleçlerle ilgili notlar
. İmleç birden fazla satır içeriyorsa, son dizenin başarısı için periyodik bir kontrol ile bir veri alma döngüsü düzenlemek gerekir.
. İmleç dizesinin tablolarından ve gönderilerinin aksine, bölümü açıkça kullanılmaktadır. Tarafından sipariş.veya belirli bir DBMS'de kabul edilen anlaşmalara uygun olarak.
. İmleçler ayrıca, güncellenebilecek veya silinebilen dizeler grubu tablolarından örnekler için de geçerlidir.
. İmlecin güncellenmesi için, sunum olarak aynı kriterleri karşılamalıdır, yani bölümler içermez Birlik, Sipariş, Grup tarafından, farklı.

10) İmleçten veri silmek için örnek

exec SQL, Müşteriden SELECT * için İmleç Cur1'i bildirin
Nerede derecelendirme.
// Print (@ F1 + '' + Convert (varchar (5), @ F2))
Exec SQL Müşteriden Sil
Cur1'in akımının; ) - İmleçten çıkarılacak veriler
bitmiş değil:
Exec SQL Yakın İmleç Cur1; - yakın akım
çıkış ();

11) Komisyondaki artışın bir örneği

exec SQL SELECT * SALESPEOls'tan SELECT * için Curcust Deldir
Snum in (rating \u003d 300) 'nin müşterisinden snum'u seçin); - İmleci belirleyin
Exec SQL Açık İmleç Curcust; - İmleç gerçekleştir
İken (sqlca.sqlcode \u003d\u003d 0) (- Tablodaki verileri güncellemek için bir döngü oluşturun
Exec SQL Fetch Curcust: Id_num ,: Satışçı ,: Loc, PROM;
Exec SQL Güncellemesi Satış Ödülleri Set Comm \u003d Comm + .01
Curcust; ) - imleçten almak için güncelleme verileri
Exec SQL Yakın İmleç Curcust; - yakın akım

S.Name, Max (S.City) şehri, toplamı (O.AMT) olarak AMT olarak S.Snum \u003d O.Snum Grubu'nun S.Name Siparişi ile S.Name Siparişinden Seelect.

SELECT S.NAME, MAX (S.City) olarak Cur1 kaydırma imlecini ilan edin.
Açık cur1
Cur1'den gelecek getirmek
@@ fetch_status \u003d 0
Başla.
Cur1'den gelecek getirmek
Son.
CUR1'i kapatın.
Deallocate Cur1

İlaç ekibi, manipülasyon için tablodan kayıtları çıkarmak için sıraya girmemizi sağlar. Bu, SQL tarafından gerçekleştirilen geleneksel veri kümelerinin işlenmesi yerine inşaat işlemesine izin verir.

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

İmleç, Declare Command tarafından oluşturulur. İmleç açık komutla açılır.

İmleç işlemleri, FETCH komutu kullanılarak üretilir. İmleç yakın komutla kapanır.

Dec Etkileyici komutu, SELECT ifadesini gösterir. SELECT ifadesi tarafından döndürülen her satır ayrı ayrı kaldırılabilir ve işlenebilir. Oracle için aşağıdaki örnekte, imleç reklam bloğunda diğer birkaç değişkenle birlikte bildirilir. Bundan sonra, bir sonraki başlangıçta ... Sonunda, imleç açılır, bu şekilde örneklenir ve imleç kapanır.

İmleç Title_price_cursor seçici başlık, fiyat kesikleri

Nerede fiyat boş değil; tiyatar_price_val title_price_cursor RowType; New_price numarası (10.2);

Başlık_price_cursor;

Title_price_cur-Sor'u tibet_price_val'e getirin;

nEW_PRICE: \u003d "title_price_val.price" * 1.25 insert now_title_price değerlerine ekle

(Title_price_val.title, new_price) Kapat title_price_cursor; Son;

Bu örnek PL / SQL kullandığından, bu kitapta bu kitapta açıklamayacağız. Bununla birlikte, bir imleç reklam açıklamada açıkça görülebilir. Yürütülebilir Blok PL / SQL'de, imleç açık komut tarafından başlatılır, değerler alma komutu tarafından alınır ve son olarak, imleç Kapat komutuyla kapanır.

SELECT'in talimatı imleçin temelidir, bu kadar iyi uygulama, İmleci İmleci talimatına dahil edilmeden önce kapsamlı bir testtir. Seçme talimatı temel bir tablo veya temsil ile çalışabilir. Bu nedenle, salt okunur imleçler gereksiz fikirlerle çalışabilir. SELECT komutu, bu teklifler kaynak tabloyu güncellememesi durumunda, grup tarafından, Grup tarafından ve sahip olduğu gibi öneriler içerebilir. İmleç güncelleme için tanımlanırsa, SELECT ifadesinden bu tür önerileri silmeniz önerilir.

Yerel imleçler genellikle saklı yordamların çıkış parametreleri olarak kullanılır. Bu nedenle, saklı yordamda, imleci tanımlayabilir ve doldurabilir ve onu paket görevine veya saklı yordamaya aktarabilirsiniz.

DB2'nin bir sonraki basit örneğinde, departmanları, bölümlerin adlarını ve yöneticilerin admin_group "HO1" sayısını gösteren imleci ilan edeceğiz.

Dept_cursor imlecini ilan edin.

SELECT DEPT_NBR, DEPT_NAME, MGR_NBR

Admin_group \u003d "x01"

Sipariş D "EPT_NAME ASC, DEPT_NBR DESC, MGR_NBR DESC;

Aşağıdaki örnekte, Microsoft SQL Server ilan edilir ve yayıncıların tablosu için imleç açılır. İmleç, yayıncılar tablosundan ilk kaydı seçer, ilgili SELECT ifadesi ve başka bir tabloya ekler. Sonra bir sonraki kaydı, ardından tüm kayıtlar işleninceye kadar bir sonraki kaydı gider. Son olarak, imleç kapatır ve hafızayı serbest bırakır (dağıtım komutu yalnızca Microsoft SQL Server'da kullanılır).

@Publisher_name varchar (20)

PUB_CURSOR İmlecini, "ABD" ülkesinin bulunduğu yayıncılardan seçilmiş pub_name için ilan edin

Pub_Cursor'dan Publisher_Name'ye getirin

@S\u003e fetch_status \u003d 0

Yabancı_publishers değerlerine ekleyin ("J\u003e Publisher_Name)

Close pub_cursor dağıtım pub_cursor

Bu örnekte, imlecin kayıt kümesini hareket ettirdiğini görebilirsiniz. (Bu örnek, yalnızca bu fikri göstermek için tasarlanmıştır, çünkü gerçekte bu görevi çözmenin daha iyi bir yolu olduğundan, yani Ekle, Seçme ifadesi.)


İmleç - Bağlamsal bellek alanına referans. SQL programlama dilinin bazı uygulamalarında (Oracle, Microsoft SQL Server), ortaya çıkan ayar ve bununla ilişkili mevcut kayıt işaretçisi yerine getirilir. İmlecin alternatif bir veri ambarı olan sanal bir masa olduğunu söylerdi. Bu durumda, imleç, verilerinize sıradan dizinin verilerine kadar dönmenizi sağlar.
İmleçler saklı yordamlarda kullanılır. Güzel teoriler bir örnek olarak görelim:
Bir veritabanımız var (temel biraz iyi değil, laboratuar çalışmalarımdan biri, ancak veritabanlardaki öğretmenimiz böyle bir yapı üzerinde ısrar etti)
/ * Banka verileri * /
Masa Yarat `Bank` (

`Bankname` varchar (50) UTF8_BIN'i NULL varsayılan değil" ",


Birincil Anahtar (`Bankid`)

) Motor \u003d innodb
Karakter seti "UTF8" harmanlamak "UTF8_BIN";
/ * Mevduat verileri * /
Masa oluştur `bankdistribution` (
`Bankid'in tamsayısı (11) null değil,
`İlerleme tamsayısı (11) Varsayılan ,
`BAĞLIYORUM ORDIMAL (10,0) NULL değil,
`Clientid'in tamsayısı (11) null değil,
Birincil Anahtar ("Bankid`,` ClientID ',
Anahtar `BHACKID` (" Bankid`),
Anahtar `clientid` (` clientid`),
Kısıtlama `BankDistribution_fk` Yabancı Anahtar (" Bankid`) Referanslar `Bank` (" Bankid`),
Kısıtlama `BankDistribution_FK1` Yabancı Anahtar (` ClientID ') Referanslar `Client` (` ClientID')
) Motor \u003d innodb
/ * Mevduat veri * /
Masa Yarat `Müşteri`
`Clientid 'integer (3) null auto_increment değil,
`CreditCardid` Bigint (10) null değil,
`Soyadı 'varchar (50) UTF8_BIN'i NULL varsayılan değil!
`Name` varchar (50), UTF8_BIN'i boş değil" ",
`FirstName 'Varchar (50) UTF8_BIN'i NULL varsayılan değil" ",
`Telefon` varchar (50), UTF8_BIN'i NULL varsayılan değil" "haraştırın,
`Adresin varchar (50) UTF8_BIN'i NULL varsayılan değil" ",
`Safeid'in tamsayısı (5) boş değil,
Birincil Anahtar (`ClientID ',` CreditCardid`,
Anahtar `clientid` (` clientid`)

) Motor \u003d innodb
Auto_inCrement \u003d 11 Karakter Seti "UTF8" Kolatlık "UTF8_BIN"

Her bankaya girmemiz ve bununla ilgili bir tür eylemler üretmemiz gerektiğini varsayalım, bu konuda yardımcı olabiliriz.

'Bank`' seçeneğini seçin. * 'Bank` limiti number_name_name_sapsy, 1
. Böylece, Number_Name_nam_pisi limitini kullanarak, 1 Banka tablosundan bir döngüde, her kaydı ve ihtiyacımız olan eylemleri üretirken, 1 numaralı numarasının değerini artırırken, 1'de aynı yapacağız, ancak imleci kullanacağız.
Başla.
/ * Verileri çıkardığımız değişkenler * /
Vbankid tamsayısında ilan etmek;
Vbankname Varchar (50);
Vaddress Varchar (50);
Vphone Varchar (50);
/ * Değişken Hadler - A * /
Defile tamsayı varsayılan 0;
/ * İmleç duyuru * /
Bankkursor imlecini, 'Bank`' 'seçim için ilan edin. BankIn, `Bank` .`bandname,` Bank`.`address`, `Bank`````den`den' Bank` ni;
/ * Aşağıda açıklanan işleyici randevusu * /
SQLState için devam edin "02000" Set \u003d 1;
/ * Açılış imleci * /
Açık bankacılık;
/ * Verileri kaldırın * /
Yaparken \u003d 0 yapın

İhtiyacımız olan eylemi yapıyoruz
İken sonunda;
/ * İmleç Kapatma * /
Bankkorumsörü Kapat;
Son;

* Bu kaynak kodu Kaynak Kod Vurgulayıcı ile vurgulandı.

HATA: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

Mesaj: Veri yok - sıfır satır, seçilen veya prosedür getirildi

SQLState: 02000 İmlecin sonuna ulaşıldığında veya seçildiğinde veya güncellediğinizde boş bir dize döndürdüğünde tetikler.

Bir sonraki satır, Cursor_Name imlecini select_statement imleci için açıkladık;
Açık Cursor_Name imlecini açın;
Daha sonra, verileri ayıklayarak imlecin sonuna (yapılır \u003d 0 yaparken) ulaşırız.
Saklı yordamadan çıkmadan önce, imleci kapatmanız gerekir. Cursor_name;

Karmaşık bir şey gibi görünüyor. Ancak SQLState "02000" ile çok fazla tuzak bağlanır.

Yaparken \u003d 0 yapın
BankCursor'u VBankid, VBankname, Vaddress, Vphone'a getirin;

Bankİn \u003d VBankid sınırının 1 olduğu banktistiğin VContribueUmountsum'a dahil olmak üzere (BAĞLIYOR) seçin;
bazı eylem yapmak
İken sonunda;

* Bu kaynak kodu Kaynak Kod Vurgulayıcı ile vurgulandı.


Hepsi iyidir ve sözdizimi açısından haktır. Ancak mantıksal bakış açısı yoktur. Mevdi macunların bir tür bankada hesap açmadığı, daha sonra BankDidributeMountSum'tan BankId \u003d VBankid sınırının 1; SQLState çalışacak: 02000, Yapılan değişken 1 olarak ayarlanacak ve iken döngü beklediğimizden daha erken sona erecek. Bu, evlat edinme tarafından aşağıdaki gibi önlenebilir.
Yaparken \u003d 0 yapın
BankCursor'u VBankid, VBankname, Vaddress, Vphone'a getirin;
/ * Banka için ekstrakt, mevduatın herhangi birinin miktarı * /


eğer (vcontributeingsum\u003e 0) ise
/ * Banka için ekstrakt, mevduatın herhangi birinin miktarı * /

eğer biter;
bazı eylem yapmak
İken sonunda;

* Bu kaynak kodu Kaynak Kod Vurgulayıcı ile vurgulandı.


İlk talebi kontrol ettik ve mevduat olup olmadığı (VContributeMountSum \u003d\u003d 0 yoksa) ve yalnızca varsa, verileri çıkarırız.

Şimdi her müşteri için farklı bankalardaki hesaplardaki toplam tutarı tedavi etmemiz gerektiğini söyleyelim.
Clientsumscursor imlecini seçme toplamı için bildirin

Clientsumskursor imlecini, 'Bankdistribution`.`cributeamount` için (`bankdistribution`.`cributeamount", "Bankdistribution`.`clientid`den` bankdistribution` (client.clientID \u003d Bankdistribution.`clientID' 'dan bir grubun' banknidration` tarafından bir grubun. `ClientID ';

Açık clientsumscursor;
Yaparken \u003d 0 yapın
BankCursor'u VBankid, VBankname, Vaddress, Vphone'a getirin;
/ * Banka için ekstrakt, mevduatın herhangi birinin miktarı * /
BankId \u003d VBankid sınırının 1 olduğu banktistiğin vcontribueuntsumom'unda SOUND (BAĞLIYOR) seçin.
/ * Bu bankada katkıların olup olmadığını kontrol edin * /
eğer (vcontributeingsum\u003e 0) ise
/ * Banka için ekstrakt, mevduatın herhangi birinin miktarı * /
BankID \u003d VBankid limit 1'in;
eğer biter;


Bazı eylemler yapmak.
İken sonunda;

* Bu kaynak kodu Kaynak Kod Vurgulayıcı ile vurgulandı.

Aynı durum, CransIrsumsCursor imlecindeki veriler BankCursor'daki verilerden daha erken bitecekse, SQLState: 02000, Yapılan değişken, 1 olarak kurulacak ve beklenenden daha erken bitecek. Bu, evlat edinme tarafından aşağıdaki gibi önlenebilir.

Açık clientsumscursor;
Yaparken \u003d 0 yapın
BankCursor'u VBankid, VBankname, Vaddress, Vphone'a getirin;
/ * Banka için ekstrakt, mevduatın herhangi birinin miktarı * /
BankId \u003d VBankid sınırının 1 olduğu banktistiğin vcontribueuntsumom'unda SOUND (BAĞLIYOR) seçin.
/ * Bu bankada katkıların olup olmadığını kontrol edin * /
eğer (vcontributeingsum\u003e 0) ise
/ * Banka için ekstrakt, mevduatın herhangi birinin miktarı * /
BankID \u003d VBankid limit 1'in;
eğer biter;
/ * İkinci imleçten veri çıkarmadan önce, SQLState durumunu hatırlıyoruz * /
Set old_status \u003d bitti;
/ * İhtiyacımız olan verileri kaldırın * /
Clientsumscursörü VSUM, VClientID'ye getirin;
/ * Verilerin alınıp alınmadığını kontrol ederek, SQLState 0200 * /
eğer (Tamam \u003d 0) o zaman
Bazı eylemler yapmak.
eğer biter;
/ * Eurmanov'a kadar bitmeden önce, değişkenin değeri * /
yapıldı \u003d old_status;
İken sonunda;

* Bu kaynak kodu Kaynak Kod Vurgulayıcı ile vurgulandı.

Bu yerden önce hepinize teşekkür ederim, umarım bu faydalı birine görünecektir.

Rebeca M. Riordan "Transact-SQL'deki İ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 SQL geçici nesnesidir. Bununla birlikte, ortaya çıkan sorgu satırları kümesini döngüsündeki, her satırı ayrı ayrı okuma ve işlemeden geçmek mümkündür. Saklı yordamlarda imleçleri kullanarak, Select Beyanı Sözdizimini kullanarak ifade etmek zor olan karmaşık hesaplamalar yapabilirsiniz. Dersin büyük teorik materyali çok iyi örneklerle tamamlanmaktadır. Özellikle, Cursor_Status işlevinin kullanılması, @@ cursor_rows ve @@ fetch_status değişkenlerinin açıklaması ve daha fazlası olarak kabul edilir.

Öğreneceksiniz:

  • imleç;
  • imleci açın;
  • imleci kapatın;
  • imleci serbest bırakın;
  • basit bir getirme komutu kullanın;
  • dize değişkenlere örnekleme;
  • mutlak konumunda bir dize seçmek için;
  • göreceli konumunda bir dize seçmek için;
  • konumsal bir modifikasyon gerçekleştirin;
  • konumsal bir çıkarma gerçekleştirin;
  • birden fazla imlecle satır sayısını belirlemek için @@ cursor_rows genel değişkenini kullanın;
  • fetch komutunun sonuçlarını belirlemek için Global @@ Fetch_Status değişkenini kullanın;
  • İmleç durumunu istemek için Cursor_Status özelliğini kullanın.

İlişkisel veritabanlarının karakteristik özelliklerinden biri, eylemlerin dizeleri kümelerinin üzerinde yapılmasıdır. Set boş olabilir veya sadece bir dize içerebilir, ancak hala bir set olarak kabul edilir. Bu, ilişkisel işlemler için gerekli ve kullanışlı bir özelliktir, ancak bazen uygulamalar için çok uygun olmayabilir.

Örneğin, belirli bir dizeyi bir sette belirtme imkanı olmadığı için, bir seferde dizelerin kullanıcısına bakış açısı zorluklara neden olabilir. Standart SQL diline verilen Transact-SQL uzantıları, çok daha fazla programlama fırsatını uygulamanıza izin vermesine rağmen, yine de operasyonlar, setlerle çalışma ilkelerine dayanarak gerçekleştirilmesi zor, zahmetli veya hatta imkansız kalır.

Bu gibi durumlarla başa çıkmak için, imleçler SQL'de verilmektedir. İmleç, belirli bir dizeyi bir sette gösteren bir nesnedir. Oluşturduğunuz imlecin özüne bağlı olarak, imleci set içine taşıyabilir ve verileri değiştirebilir veya silebilirsiniz.

İmleçler kavramı

Microsoft SQL Server, iki farklı imleci türünü destekler: Transact-SQL imleçleri ve API imleçleri (Uygulama Programlama Arabirimi İmleçleri). API imleçleri, Microsoft ActiveX Veri Nesneleri (ADO) nesneleri, OLE DB, ODBC veya DB kütüphanesi kullanarak uygulamanın içinde oluşturulur. Bu API'lerin her biri birkaç farklı özelliği destekler ve farklı bir sözdizimi kullanır. Burada API imlecini ayrıntılı olarak tartışmayacağız; Onları kullanmayı planlıyorsanız, API'deki uygun belgelere ve uygulayacağınız programlama diline bakın.

Transact-SQL imleçleri, Declare Cursor komutu kullanılarak oluşturulur. Hem imleç nesnesi hem de sunucuda gösterdiği birçok satır var. Bu tür imleçler sunucu imleçleri denir. Sunucu imlecini, SQL sunucusuna ağ üzerinden bağlanan uygulamadan kullanırsanız, imleçle her bir işlem ikili ağ etkileşimi gerektirir. Sunucu imleçlerini destekleyen API-imleç kütüphaneleri, istemci sisteminde bulunan istemci imleci de desteklemektedir ve istemci üzerinde işlendiği satırları önbelleğe alır.

İmlecin, Seçme komutu kullanılarak belirlendiği birçok satır. Seçme komutuna Transact-SQL imleci oluştururken, birkaç kısıtlama üst üste bindirilir:

sELECT komutu birkaç sonuç kümesini döndüremez;

seçme komutu, yeni bir tablo oluşturmak için bir cümle içeremez;

seçim komutu, sonuçları toplamak için kullanılan cümle ile bir hesaplama veya hesaplama içeremez. (Bununla birlikte, örneğin AVG) toplama fonksiyonları içerebilir.)

İmleçlerin Özellikleri

Transact-SQL, birkaç farklı imleci türünü destekler. İmlecilerin her birinin çeşitli özelliklerini bulmak oldukça sıkıcı bir görevdir, ancak her bir imleci, üç veya daha az bağımsız özellik için dikkate alındığında, daha fazla az veya daha az bağımsız özellik: kaynak verilerindeki değişiklikleri yansıtma yeteneği, kolaylaştırılabilir. Çeşitli dizeleri ve set satırlarını değiştirme yeteneğinin yanı sıra çeşitli dizelerle gezinme yeteneği.

Değişikliklerin yansıması

İmlecin verilerindeki değişiklikleri yansıtma kabiliyeti imlecin duyarlılığı olarak adlandırılır. Bir operatör imleci oluşturduğunuzu varsayalım:

SEÇİMİ * SOL (OilName, 1) \u003d "B" Aromaterapi Veritabanı, Şekil 1'de gösterildiği gibi dört satır döndürür. İmleçinizi kullanma işleminiz varsa, Bergamot öğesinin açıklama değerini eklerse veya Bayberry Element için bir dize eklerse, imlecinizin hangi ipucun olduğunu gösterir?

İncir. 1. Aromaterapi veritabanı, B harfleriyle başlayan dört satır içerir.

İmleciniz oluştururken, iki tür hassasiyet bağımsız olarak tanımlanabilir: Sette (çoklu ayarlanmış) ve kaynak hatlarındaki değişikliklerin yansımasını nasıl değiştirilir?

Kaydırma

İmlecin ikinci özelliği, hem ileri hem de ileri ya da ileriye kaydırma yeteneğidir. İşte programlama için solenit ikilemi: esnekliğe karşı hız. Ardışık imleçler (sadece ileri) çok daha hızlı çalışır, ancak daha az esnekliğe sahiptir.

Güncelleme

İmleci sınıflandırmak için kullanılan son karakteristik, ipi imleci ile güncelleme yeteneğidir. Yine, imleçler "salt okunur" genellikle daha üretkendir, ancak daha az esnekliğe sahiptir.

İmleç türleri

Transact-SQL, dört farklı imleci tipini destekler: statik, anahtar, dinamik ve hızlı erişim imleçleri veya ateşhe. Her imleç tipi, ek olarak, her bir imleç türü, önceki bölümde tartışılan özelliklerin çeşitli kombinasyonları ile karakterize edildiği çizgilerle ilgili çeşitli verileri depolar.

Statik imleçler

Statik imleç, SELECT ifadesi tarafından belirlenen verilerin bir anlık görüntüsünü yapar ve onları tempdb veritabanında saklar. "Yapıda ya da veri değerlerinde değişiklikler" hissetmez "ve herhangi bir değişiklik yalnızca kopyalar halinde yansıtılacağı için, bu imleç her zaman" Salt Okunur "modunda açılır. Bununla birlikte, statik imleçler, tutarlı veya kaydırma olarak bildirilebilir.

Anahtar imleçler

Anahtar imleç, yalnızca bu sütunları her bir dizgiyi benzersiz bir şekilde tanımlayan tempdb veritabanına kopyalar. Seçme ifadesinin tanımında olan her tablo olan anahtar imleci ilan edebilmek için, anahtarı tuşa ayarlayan benzersiz bir dizin olmalıdır.

Anahtar imleçler hem değiştirilebilir hem de "salt okunur" moduna sahip olabilir. Ayrıca kaydırma veya sıralı olabilirler.

Anahtar imlecine üyelik İmleç duyurusu sırasında sabittir. İmlecin açık hali sırasında seçim durumunu karşılayan bir dize eklenirse, kümeye eklenmez. Önceki örneğimizde, Sol (OilName, 1) \u003d "B" seçim koşulu olarak kullanıldı, "Bayberry Field" olan petrol adıyla yeni hat, imleç alanına ilişkin dizelere eklenmeyecek.

Benzer şekilde, değişiklik, örneğin "Kumquat" üzerindeki "Fesleğen" yerine, "Fesleğen" yerine "Fesleğen" yerine, "Kumquat" yerine "fesleğen" yerine getirilecek bir dizgeye girilirse benzer şekilde. Dize çıkarılmış olsa bile, hala kümenin bir üyesi olmaya devam eder, ancak SQL Server tüm sütun değerleri için NULL döndürür.

Bununla birlikte, imleci açtıktan sonra çoklu imlecin üyeliği sabit kalmasına rağmen, kaynak tablolara yapılan veri değerlerindeki değişiklikler yansıtılır. Örneğin, Bergamot String için açıklama alanının değerini değiştirmek imleciye iade edilecektir. Bununla birlikte, birden fazla tuş takımındaki değişiklikler, imleçlere yalnızca imlecin içinde gerçekleştirilirse yansıtılır. Önceki örneğin devamıda, petrol kuyruğu alanının değeri "fesleğen" den imleci içindeki "fesleğen" olarak değiştirildiyse, imleç "Kumquat" i döner. Değişiklik başka bir kullanıcı tarafından yapılırsa, imleç hala "fesleğen" döndürür.

Konsey. Bir sonraki bölümde göreceğimiz gibi, imlecin oluşturulması ve imlecin açılışı farklı işlemlerdir. Anahtar imlecinin içeriğini güncellemek için, kapatıp yeniden açabilirsiniz.

Dinamik imleçler

Dinamik İmleç, her seferinde her erişimin SELECT ifadesini yeniden yaptığında davranır. (Aslında, her şey biraz farklı olur, ancak bu performans, dinamik imleçlerin çalışmalarını daha iyi yargılamanıza izin verir.) Dinamik imleçler, bu değişikliklerin imleç içinde yapılıp yapılıp yapıldığına bakılmaksızın, hem üyelik hem de başlangıç \u200b\u200bveri değerleriyle ilgili değişiklikleri yansıtır. Başka kullanıcı.

Dinamik İmleçler İçin Bir Sınır Var: İmleci tanımlamak için kullanılan Seçme ifadesi, yalnızca siparişte kullanılan sütunları içeren bir dizin varsa, cümle ile siparişi içerebilir. Anahtar imlecini, dizini çalıştırmayan cümleyi kullanarak bir şekilde bildirirseniz, SQL Server imleci tuşa dönüştürür.

Hızlı erişim imleçleri

SQL Server, yalnızca okumaya izin veren, kaydırılmış olmayan bir imleci formunu destekler. İmlecin bu görünümü, Fast_forward anahtar kelime kullanılarak ilan edilir ve çoğu zaman "Firehose" imleci olarak adlandırılır.

İtfaiyeciler imleçler çok etkilidir, ancak kullanıldığında iki önemli kısıtlama vardır. Öncelikle, SELECT, NTEXT veya Image Veri türü ile sütunlar kullandıysanız, SQL Server cümlesi imleci tuşa dönüştürür.

İkincisi, İmleci belirlemek için kullandığınız SELECT ifadesi, tetikleyicileri ve tetikleyicileri olmayan tablolara sahip olan tabloları içerirse, imleç statik olarak dönüştürülür. Tetikleyiciler, veri manipülasyon dili (DML) operatör tablosunu yürütürken sunucu tarafından otomatik olarak yürütülen Transact-SQL komut dosyalarıdır. Daha fazla ayrıntı, Sınıf 29'teki tetikleyicileri göz önünde bulundurur, şimdi bir sonraki noktaya dikkat edecektik: Biri imleç tarafından kullanılan tablolardan birine bir tetikleyici eklerse, uygulamanızın yürütmeyi durdurabilir, çünkü SQL Server daha hızlı bir imleci daha az dönüştürür. hızlı.

İmleçlerin kullanımı

Yerel değişkenlerin kullanımı gibi imleçleri kullanarak - onları ilan edin, değeri ayarlayın ve ardından kullanın. Bununla birlikte, işlem alanı çıktı olduğunda otomatik olarak tahrip olan yerel değişkenlerin aksine, imleç tarafından kullanılan dizeyi açıkça bırakmanız ve ardından imleci yok etmelisiniz.

İmleç Oluşturma

İmleci kullanmanın ilk adımı oluşturulmasıdır. Transact-SQL imleçleri, ilan imleci operatörü kullanılarak oluşturulur.

Dikkat! SQL Server iki farklı imleci oluşturma yöntemini destekler: SQL-92 sözdizimini kullanarak ve Transact-SQL sözdizimini kullanarak. SQL-92 sözdizimi, ANSI standardına uygundur, ancak burada göz önünde bulundurulan Transact-SQL sözdiziminden daha küçük işlevselliğe sahiptir.

İmleci operatörü, aşağıdaki sözdizimine sahiptir:

İmleç adını bildir

[Görünürlük]

[Kaydırma]

[Kilit]

Operator_sets için

İmlecin özelliklerini belirleyen tüm parametrelerin - görünürlük, tür vb. - İsteğe bağlıdır. Bu parametreler için varsayılan değerler karmaşıktır ve kaynak kayıtları veya görünümleriyle etkileşime girmenin yanı sıra veritabanıyla çalışma seçenekleriyle etkileşime girmenin yollarını belirtebilir veya belirtmeyin. Operatörün algısını daha rahat hale getirmek için, ihtiyacınız olan tüm parametreleri açıkça belirlemek daha iyidir. Aynı zamanda tam olarak ne aldığınızı bileceksiniz.

İmlecin görünürlüğü, geçici tabloları bildirirken @local_table veya @@ global_table ile aynı etkiye sahip olan yerel veya global anahtar kelimeleri kullanılarak belirlenir.

Konsey. SQL Server, eylem alanının sınırlarını (görünürlük) ayrılırken yerel imleci kapatır ve serbest bırakır, ancak her zaman açıkça yapmak daha iyidir.

Kaydırma parametresi, sırasıyla, yalnızca baştan sona veya herhangi bir yönde hareket etme olasılığını sırasıyla belirtilen ileri_only ve kaydırma anahtar kelimelerini kullanmanıza izin verir.

Tip parametresi, oluşturulan imleci türünü tanımlar. İşte statik, keyset, dinamik ve fast_forward anahtar kelimeleri. Fast_forward tipi parametre ve ileri_only kaydırma parametresi karşılıklı olarak özeldir.

Kilit parametresi, dizelerin imleç tarafından değiştirilip değiştirilip değiştirilebileceğini belirler ve diğer kullanıcıların onları değiştirebilir mi? Read_only anahtar kelime kullanılıyorsa, imleç kaynak verilerinde herhangi bir değişiklik yapamaz. Ancak, diğer kullanıcılar verileri değiştirebilir veya güncelleme bildirimini kullanarak kendiniz yapabilirsiniz. Engelleme parametresi, kaydırma_locks belirttiği durumlarda, güncellemeler yalnızca imleç tarafından yapılabilir. Hem aynı pakette hem de diğer kullanıcılar tarafından sağlanan diğer tüm güncelleme ifadeleri yürütülmeyecek.

Son engelleme seçeneği, iyimser, imleç içinde ve dışında dizeleri güncellemenizi sağlar. Bu, en esnek seçenektir, ancak imleci okuduktan sonra dize değiştirildiyse, imleç tarafından yapılan değişikliklerin tamamlanması olasılığı vardır.

Type_Warning parametresi, İmleç türü başka bir türde belirtilen tipten dönüştürülürse, istemciye bir uyarı mesajı göndermek için SQL Server'ı veriyor. Belirtilen Select ifadesini desteklemeyen bir imleci ilan ederseniz bu mümkündür.

Parametre operatörü_, ifade için belirtilen, zorunludur. Birçok imleciye dahil edilecek çizgileri belirtir.

Güncelleme için cümle isteğe bağlıdır. Varsayılan olarak, RAAD_ONLY parametresi belirtilmemişse, imleçler değiştirilir, ancak bu durumda bu cümleyi elde edilen sonuçta kendinden emin olmak için hala daha iyidir. Bir değişiklik yaptığınız belirli satırları belirtmek için ad_stolbets bölümünü kullanabilirsiniz. NAMES_LBS bölümünü indirirseniz, Modifikasyon Seçme ifadesinde belirtilen tüm sütunlar için yapılabilir.

İmleç değişkenleri

Transact-SQL, imleç gibi değişkenleri bildirmenizi sağlar. Bu durumda, standart beyan sözdizimi imleci oluşturmaz; SET anahtar sözcüğünü kullanarak imleci için değişkeni açıkça ayarlamanız gerekir.

Mycursor imlecini bildirin.

Yağlardan SeCt OilName için

@Mycursorvariable imleci ilan edin

@Mycursorvariable \u003d MyCursor Set

Bu sözdizimi, çeşitli imleçlere atanabilecek değişkenler oluşturmak istiyorsanız yararlıdır. Bu, farklı sonuç kümeleri ile çalışmak için genelleştirilmiş bir prosedür oluşturursanız bu gerekli olabilir.

Bir imleci değişkeni ilan edebilir ve ardından doğrudan bir imleci oluşturmak için kullanın.

@Mycursorvareable imleç set @mycursorvareable \u003d imleci yerel fast_forward için local fast_forward için yağlar

Böyle bir sözdizimini kullanırken, imleç bir tanımlayıcıya sahip değildir ve bu referans sadece değişken boyunca gerçekleştirilebilir.

İmleci açma

İmleç bildirimi bir imleç nesnesi oluşturur, ancak imlecin manipüle edeceği bir dizi kayıt oluşturmaz (çoklu imleç). İmleci açana kadar birçok imleç oluşturulmaz. İmleci operatörünün yeterince karmaşık bir sözdiziminden sonra, operatör sözdizimi oldukça şeffaf görünüyor:

Cursor_ili_named open

Küresel anahtar kelime çatışmalardan kaçınmaya yardımcı olur: İmleç yerel anahtar kelimesiyle ilan ederse ve küresel anahtar kelimeyle ilan edilen imleci aynı tanımlayıcıya sahipse, küresel kullanmadıysanız, imleç bağlantıları varsayılan olarak algılanır. Anahtar kelime. Diğer benzer durumlarda olduğu gibi, küresel imleci açarsanız bir anahtar kelime belirtmek daha iyidir.

Kapatma imleci

İmleci kullanarak bitirdikten sonra, kapatmalısınız. Yakın operatör, imleci çok sayıda sürdürmek için kullanılan kaynakları serbest bırakır ve Declare ifadesindeki kaydırma parametresini kullandıysanız, dizelerdeki tüm kilitleri de serbest bırakır. Kapat komut sözdizimi, operatör sözdizimini açmak neredeyse aynıdır - yalnızca anahtar kelime değişiklikleri:

Close cursor_ili_named

Kurtuluş imleci

İmlecin oluşturulmasıyla ilgili eylemlerin sırasındaki son operatör operatörün dağıtılmasıdır. Sözdizimi de basittir:

Deallocate Cursor_ili_named

Bununla birlikte, bir inceliktir: Deltocate operatörü, tanımlayıcıyı veya imleci değişkenini kaldırır, ancak imlecin kendisini çıkarmaz. İmlecin kendisi, belirtilen tüm tanımlayıcılar ya serbest bırakılıncaya kadar silinmez veya hareket etmeyi durduracak (eylem aralığından ayrılırken). Aşağıdaki örnekleri göz önünde bulundurun:

Bir ilan oluşturma Mycursor imleci KeySet Read_only için Seçim * Yağlardan * Bir imleç değişkeni oluşturma @Cursorvariable imleci ilan edin - Bir dizi açık mycursor imleci kayıtları oluşturma - Set'in amacı @Cursorvareable \u003d MyCursor Mevcut Değişken İmleç

İmleç serbest bırakıldıktan sonra, mycursor tanımlayıcısı artık çok sayıda imleçle ilişkilendirilmez, ancak değişkenin @cursorvareable, imleç ve birçok imleç imleç kümesine muaf değildir. Açıkça piyasaya sürülmediyseniz, imleç değişken, imleç ve birçok imleç, değişken eylemini kaybedecek olana kadar mevcut olacaktır.

İmleci kullanarak dizeleri manipüle

İmleçler kendileri, yardımlarıyla belirli eylemler yapamazsanız herhangi bir ilgiye neden olmazlardı. Transact-SQL, imleçlerle çalışmak için üç farklı komutu destekler: Getir, Güncelleme ve Sil.

Alma komutu, belirtilen dizgiyi çeşitli imleç dizelerinden alır. Basit versiyonunda, Fetch komutu aşağıdaki sözdizimine sahiptir:

PRETCH CURSOR_ILI_NAME

Bu kayıt biçiminde, bir dize imleç konumuna (geçerli satır) döndürülür.

Basit bir getirme komutu kullanın

  1. Kök dizininde SQL 2000 Adım adım klasörüne gidin, SimpleCursor adlı komut dosyasını vurgulayın ve Aç (Açık) 'ı tıklatın.
  2. Query Analyzer, komut dosyasını sorgu penceresine indirir.

Konsey. Bu komut dosyasının ilgili SELECT ifadesinden daha uzun yürütüldüğünü fark edebilirsiniz. Gerçek şu ki, imlecin yaratılmasının ve açılmasının ek süre gerektirmesidir. SELECT ifadesi görevi yürütmek için yeterli ise, imleci asla kullanmayın.

Fetch komutu sadece dize doğrudan döndüremez, aynı zamanda değerleri döndürülen sütundan değişkenlerde kaydetmenize de izin verir. Fetch komutunun sonuçlarını değişkende kaydetmek için aşağıdaki sözdizimini kullanın:

Cursor_yli_nament'i liste_name içine getirin

List_name, virgülle ayrılmış değişken tanımlayıcıların bir listesidir. Alma komutunu yürütmeden önce değişkenleri bildirmelisiniz. List_name, imleci tanımlayan Seçme ifadesinde görünen her sütun için bir değişken içermelidir. Değişkenin veri türü çakışmalı veya sütun veri türüyle uyumlu olmalıdır.

Satırları değişkenlere kaydıyla seçin.

Tüm önceki örneklerde, mevcut satırı iade etmek için alma operatörü kullanılmıştır. FETCH operatörü sözdizimi ayrıca başka bir dize belirtmek için birkaç anahtar kelime sağlar. Bu anahtar kelimeleri kullanırken, getirme operatörü belirli bir dizgiyi döndürür ve akım yapacaktır.

Bu anahtar kelimeler size birden fazla imlecle mutlak bir konum belirleme yeteneği verir. Anahtar kelimeler, ilk ve son dizileri sırasıyla ilk ve son dizeleri iade ederken, mutlak n, başlangıçtan (eğer n ise pozitif) veya sonunda (eğer n olumsuzsa) bir imleç kayıt kümesi olan N dizeleri üzerinde bulunan bir dize ayarlar. N değeri sabit (3) veya bir değişken olarak ifade edilebilir (@Therow).

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

  1. Fetchabsolute adlı komut dosyasını vurgulayın ve Aç (açık) 'i tıklayın. Query Analyzer, komut dosyasını sorgu penceresine indirir.

Anahtar kelimelere ek olarak, dizeleri mutlak konumlarında çıkarma yeteneğine ek olarak, FETCH operatörü, stringleri mevcut satıra göre konumlarıyla çıkarmanıza izin veren üç anahtar kelimeyi sunar. Bir sonraki operatörün getirilmesi aşağıdaki satırı döndürür, önceki operatörün önceki satırı döndürür ve alıcı akraba n operatörü, geçerli olan N dizeleri üzerinde bulunan bir dize döndürür. Absolute N operatörünün getirdiği gibi, FETCH RELIATION N Operator, N olumsuz ise, akımdan önceki dizeleri ve N'nin pozitif ise akımı izleyen dizeleri ayarlayabilir.

Göreli konumda satırları seçin

  1. FetchRelative adlı komut dosyasını vurgulayın ve Aç (açık) 'ı tıklatın. Query Analyzer, komut dosyasını sorgu penceresine indirir.

İmleç bir Tipi_Only veya Past_Forward'a sahipse, sadece bir sonraki anahtar kelime pozisyonunu belirtmek için kullanılabilir. Aslında, imleç bu türden birini ifade ederse, sonraki anahtar kelime gerekli değildir. SQL Server, her bir Fetch ifadesinin aslında bir sonraki ifade almasını varsayar.

Yüksek hızlı bir imleç için bir sonraki ifadeyi kullanın

  1. FetchFireHose adlı komut dosyasını vurgulayın ve Aç (açık) 'ı tıklatın. Query Analyzer, komut dosyasını sorgu penceresine indirir.

Sorgu Analyzer sorgu Analyzer araç çubuğundaki Çalıştır Sorgu düğmesine basın. Query Analyzer talebinde bulunur.

İmleçler aracılığıyla tellerin değiştirilmesi ve çıkarılması

İmleciniz değiştirilebilirse. Birden fazla imleçteki ilk değerlerdeki değişiklik oldukça basittir. İmleç aracılığıyla modifikasyonu destekleyen bir ifadenin sağlandığı özel bir form:

Table_ili_presentation set listesini güncelleyin_modification Cursor_ili_named

Buna konumlandırılmış bir güncelleme denir. Transact-SQL ayrıca aşağıdaki kayıt formuna sahip konumsal çıkarmayı da destekler:

Cursu_ieli_tervened'in akımının olduğu table_ili_relasting silin

Bir pozisyon güncellemesi gerçekleştirin

  1. PointedUpdate adlı komut dosyasını vurgulayın ve Açık düğmesine basın. Query Analyzer, komut dosyasını sorgu penceresine indirir.

Sorgu Analiz Cihazı Sorgu Analyzer araç çubuğundaki Sorgu Yürüt düğmesini tıklayın. Query Analyzer talebinde bulunur. Lütfen iki ızgara panelinin görüntülendiğini unutmayın. Birincisi, Fetch Operatör tarafından oluşturulur ve sütunların ilk içeriğini içerir. İkincisi, SELECT ifadesinin yürütülmesinin sonucudur ve bir değişiklikten sonra açıklama alanının değerini içerir.

Transact-SQL imleçleri izleme

Transact-SQL, çalışmayı ve imlecinizin durumunu izlemenize yardımcı olan iki küresel değişken ve özellik sunar. @@ Cursor_Rows değişkeni, bağlantıya açılan son imlecin çokluğundaki satır sayısını döndürür. Döndürülen değerler @@ cursor_rows Tablo 1'de sunulur.

@@ fetch_status değişkeni, son getirme komutunun yürütülmesi hakkında bilgi verir. Tablo 2, @@ fetch_status değişkeninin getirdiği değerleri göstermektedir.

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

Cursor_Status (Tip, Cursor_ini_named) tipi "yerel", "global" veya "değişken" olabilir ve Cursor_IM_Name, almak istediğiniz bir imleç tanımlayıcısı veya imleç değişkenidir. Cursor_status işlevi tarafından döndürülen sonuçlar Tablo 3'te sunulmaktadır.

İmlecin izleme özelliklerini kullanın

  1. Durum fonksiyonları komut dosyasını vurgulayın ve Aç'ı (açık) tıklayın. Query Analyzer, komut dosyasını sorgu penceresine indirir.

Baskı versiyonu

Açık imleç, PROGRAM ADS bölümünde açıkça tanımlanan SELECT komutudur. Açık bir imleç bildirdiğinde, bir isim atanır. Eklemek, güncelleme, birleştirme ve silme komutları için açık imleçler belirlenemez.

Seçim komutunu açık bir imleç olarak tanımlayarak, programcı, bilgi örneğinin ana aşamaları üzerinde Oracle veritabanından alır. İmleci (açık) açıldığında, ondan bir dizge (getirilmiş) seçildiğinde, satırları seçmek için ne kadar ve yakın komutunu kullanarak imleci ne zaman kapatılacağını tanımlar. Mevcut imleç durumu hakkında bilgi nitelikleri ile temin edilebilir. Açık imleçleri bir programcı için paha biçilmez bir araç haline getiren yüksek kontrol detayıdır.

Bir örnek düşünün:

1 Function Jealousy_level (2 Name_in friends.Name% Type) Return Number 3 AS 4 Cursor Jealousy_Cur 5, 6 Arkadaş 7'den Konum seçeneğini seçin. 8 8 8 Jealousy_Rec Jealousy_Cur% RowType; 9 Retval Numarası; 10 11 başlangıç \u200b\u200bJealousy_Cur; 13 12 Jealousy_CUR'yi Jealousy_rec'e getirin; 15 13 Jealousy_cur% 14 bulundu. 17 elsif jealousy_rec.location \u003d "Chicago" 18 sonra retval: \u003d 1; 19 ucu ise; 20 ucu ise; 24 21 Kapat Jealousy_Cur; 26 22 dönüş retval; 23 İstisna 24 Diğerleri ise 25'ten sonra 25, Jealousy_Cur% ISOPEN ise 26 Close Jealousy_CUR; 27 ucu ise; 28 Son;

Bazı yakın bölümlerde, listelenen işlemlerin her biri ayrıntılı olarak kabul edilir. "İmleç" terimi, metinde açıkça belirtilmediği sürece, açık imleçlerle ilgilidir.

Açık bir imlecin duyurusu

Açık bir imleci kullanma yeteneğini yapmak için, PL / SQL bloğu reklam bölümünde veya paketinde açıklanmalıdır:

Cursor_Name [([Parametre [, parametre ...])] [İade spesifikasyon_SELECT] komut_select];

Burada imlecin adı açıklanan imlecin adıdır; Speediphishcia_t? O - İsteğe bağlı bölüm geri dönüşü; Komahdaselect - İzin verilen herhangi bir SQL SELECT. İmleç ayrıca parametreleri geçebilir (bir sonraki "İmleç Ayarları"). Son olarak, SELECT ... Güncelleme komutu için ... Güncelleme için bir sütun listesini ayarlayabilirsiniz (ayrıca aşağıya bakınız). Duyurudan sonra, imleç açık komutla açılır ve ondan gelen satırların seçimi Fetch komutu tarafından gerçekleştirilir.

Açık imleçlerin birkaç duyuru örneği.

  • Parametreler olmadan imleç. Bu imlecin ortaya çıkan satır kümesi, tablonun tüm satırlarından seçilen bir dizi şirket tanımlayıcısıdır:
İmleç Company_cur, şirketten Select Company_id;
  • Parametrelerle imleç. Bu imlecin ortaya çıkan satır kümesi, iletilen parametrenin değerine karşılık gelen şirketin adıyla tek bir dize içerir:
İmleç Name_CUR (Sayıda Company_Id_in) Company_ID_IN'DEN SEÇİM ADI'DİR;
  • İLK İLETİŞİM. Bu imlecin ortaya çıkan satır kümesi, 10 tanımlayıcısına sahip bir ünite için tüm çalışan tablosu verilerini içerir:
İmleç EMP_CUR İADE DÖNÜŞTÜRLERİ% ROWTYPE SELECT * SEÇİMLİĞİ NEREDE NEREDE;

İmleç adı

Açık imleçin adı, 30 karaktere kadar uzunluğa sahip olmalı ve kalan PL / SQL tanımlayıcıları ile aynı kurallara karşılık gelmelidir. İmleç adı bir değişken değildir - bu, işaretçinin istek üzerine tanımlayıcısıdır. İmleç adı değere atanmamış, ifadelerde uygulanamaz. İmleç, yalnızca açık, kapat ve alma komutlarında kullanılır ve ayrıca imleç özniteliğini netleştirmek için kullanılır.

Pakette İmleç Reklam

Açık imleçler PL / SQL Blok reklamlarında ilan edilir. İmleç paket düzeyinde ilan edilebilir, ancak belirli bir prosedürde veya paket fonksiyonunda değil. Paketteki iki imlecin reklamları örneği:

Paket book_info imleç titles_cur kitaplardan başlık seçmek; İmleç Books_cur (Title_Filter_IN Books.title% Type) Return Kitaplar% RowType, Title_Filter_IN gibi başlığın bulunduğu kitaplardan seçilir *; Son;

İlk titles_cur imleci sadece kitap başlıkları döndürür. İkincisi, Books_cur, kitapların isimlerinin, "PL / SQL" dizesini içeren tüm kitaplar (örneğin, "" PL / SQL "dizesini içeren tüm kitaplara karşılık gelen şablona karşılık gelen tüm kitap tablosundaki tüm çizgileri döndürür. Lütfen dikkat: İkinci imleçte, geri dönüş bölümü, veri yapısını alma komutu tarafından döndürülen veri yapısını beyan eder.

İade bölümünde, aşağıdaki veri yapılarından herhangi biri belirtilebilir:

  • Kayıt% RowType niteliğini kullanarak veri tablosu dizgisinin temelinde tanımlanır.
  • Daha önce açıklanan bir imlecin temelinde tanımlanan bir giriş de% RowType niteliğini kullanıyor.
  • Programcı tarafından tanımlanan bir kayıt.

İmleç örnekleme listesindeki ifadelerin sayısı, Name_Table% RowType, KYPCOP% RowType veya Kayıt Türü Kayıt Sütunlarının Sayısına uygun olmalıdır. Veri öğeleri türleri de uyumlu olmalıdır. Örneğin, örnekleme listesinin ikinci elemanı bir sayı türüne sahipse, geri dönüş bölümündeki ikinci kayıt sütununun Varchar2 veya Boolean olamaz.

İade bölümünün ve avantajlarının ayrıntılı olarak değerlendirilmesine geçmeden önce, önce çözelim, neden pakette bir reklam imlecine ihtiyacınız var? Neden kullanıldığı programda açık bir imleci ilan etmiyorsunuz - prosedürde, işlev veya anonim bir blokta mı?

Cevap basit ve ikna edicidir. İmleci pakette tanımlayarak, uygulamanın farklı yerlerinde aynı kodu tekrarlamadan, içinde belirtilen isteği tekrarlayabilirsiniz. Talebin bir yerde uygulanması, iyileştirilmesini ve kodun desteğini basitleştirir. Geri kazanım işlemlerinin sayısını azaltarak bir süre tasarruf sağlanır.

Ayrıca, REF imlecine dayanarak imleç değişkenini döndüren bir işlev oluşturma yeteneği de değerlidir. Arama programı, imleç değişkeninde bir dizge örneği gerçekleştirir. Daha fazla bilgi için, "İmleç Değişkenleri ve Ref İmleç" bölümüne bakın.

İmleçleri yeniden kullanım için paketlerde duyurur, önemli bir durum dikkate alınmalıdır. İmleçler dahil, "Paket Seviyesinde" bildirilen tüm veri yapıları (belirli bir fonksiyon veya prosedürde değil), oturum boyunca değerlerini saklar. Bu, parti imlecinin açıkça kapatıncaya kadar veya oturum tamamlanana kadar açık kalacağı anlamına gelir. Bu bloklar tamamlandığında yerel bloklarda ilan edilen imleçler otomatik olarak kapanır.

Ve şimdi iade bölümüyle ilgilenelim. İmlecin bir reklamları Paketteki bir ilginç özellik vardır: İmleç başlığı vücudundan ayrılabilir. Böyle bir başlık, daha fazla bir fonksiyon başlığına benzeyen, bir programcının çalışması için gerekli olan bilgileri içerir: imlecin adı, parametreleri ve geri dönüş verilerinin türü. İmleç, SELECT komutudur. Bu resepsiyon, Book_info paketindeki Books_cur imlecinin yeni sürümünde gösterilmiştir:

Paket Book_info imleç books_cur (book.com.tr. Son; Paket Vücut Book_info İmleç Books_cur (Title_Filter_IN Books. Son;

TÜM KARAKTERLERİ Anahtar Kelime Olmadan Önce Şartname Formu ve ardından İmleç Gövdesi'ni takip eder. İmlecin reklamlarını ayırmak iki hedefe hizmet edebilir.

  • Bilgi gizleme. Paketteki imleç "kara kutu" dir. Programcılar için uygundur, çünkü SELECT komutunu yazması veya hatta görmeleri gerekmez. Hangi kayıtların bu imleci, hangi sırayla ve hangi sütunları içerdiklerini bildirmek yeterlidir. Paketle çalışan bir programcı imleci başka bir bitmiş öğe olarak kullanır.
  • Minimum yeniden derleme. Bir sorgunun tanımını paketin gövdesinde gizlerseniz, SELECT komutundaki değişiklikler, imleci başlığını paket özelliklerinde değiştirmeden yapılabilir. Bu, bu pakete bağlı olarak programların geçersiz olarak işaretlenmeyeceği ve yeniden derlemeleri gerekmeyecekleri sayesinde, paket özelliklerini yeniden derlemeden kodu iyileştirmenizi, düzeltmenizi ve yeniden derlemenizi sağlar.

Açık imleç açma

İmleci kullanmak, ADS bölümündeki tanımıyla başlar. Daha sonra, açıklanan imleç açılmalıdır. Açık Operatör Sözdizimi çok basittir:

Open_name_name [(argüman [, argüman ...])];

Burada ana bilgisayar adı, önceden açıklanan imlecin adıdır ve argüman, parametreler listesi ile ilan edilirse, imleç tarafından iletilen değerdir.

Oracle ayrıca hem imleç değişkenleri için kullanılan bir imleci açarken ("imleç değişkenleri ve ref imleç" bölümüne ve yerleşik dinamik SQL için bir imleci açarken sözdizimini de destekler.

İmleci açma, PL / SQL, içerdiği sorguyu yürütür. Ek olarak, aktif bir veri setini tanımlar - tüm kriterlerin ve ilişkinin durumuna karşılık gelen tabloların sorgusuna katılan tüm çizgiler. Açık komut veri çıkarmaz - bu alıcı komutu görevidir.

Oracle'da uygulanan ilk veri örneğinin ne zaman olduğuna bakılmaksızın, veri bütünlüğü modeli tüm örnekleme işlemlerinin, imleci açtığında durumdaki verileri iade edeceğini garanti eder. Başka bir deyişle, açılıştan ve imleci kapatmadan önce, ondan veri seçtiğinizde, bu süre boyunca yapılan ekler, güncellemeler ve silme tamamen yoksayılır.

Üstelik, SELECT komutu Güncelleme bölümünü içeriyorsa, tüm imleç açıldığında dizenin engellendiğini tanımlar.

Açık bir imleç açmaya çalıştığınızda PL / SQL aşağıdaki hata iletisini verir:

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

Bu nedenle, imleci açmadan önce, özelliğin değerinin durumunu kontrol edin. % Açık:

Şirketler_cur% Isopen değilse, Şirketler_cur'u açın; Eğer biter;

Açık imleçlerin nitelikleri, bunlara adanmış bölümde aşağıda açıklanmıştır.

Program, imleci kullanarak çevrimde yürütülürse, bu imlecin açık bir açılmaya (veri örneği, kapatılması) ihtiyacı yoktur. PL / SQL çekirdeği otomatik olarak yapar.

Açık imleçten veri seçimi

SELECT komutu sanal bir tablo oluşturur - Sütun Seçme listesi tarafından tanımlanan sütunlarla durumla tanımlanan bir dizi dizgeli. Böylece, imleç bu tabloyu PL / SQL programında sunar. PL / SQL programlarındaki imlecin asıl amacı, işleme için bir satır örneğidir. İmleç string örneği alma komutu tarafından yürütülür:

Alt to_name_name_name__named_named;

Burada imleç adı, kaydın seçili olduğu imlecin adıdır ve değişkenlerin kaydı veya listesi - Aktif kayıt kümesinin bir sonraki satırının kopyalandığı PL / SQL veri yapıları. Veriler PL / SQL girişine (% RowType özniteliği veya türü ile ilan edilir) veya değişkenlere (örneğin, Oracle Forms öğelerinde olduğu gibi) değişkenlere (MSA / SQL veya Cilting Değişkenleri) yerleştirilebilir.

Açık imleçlerin örnekleri

Aşağıdaki örnekler veri seçmek için farklı yollar göstermektedir.

  • İmleçten PL / SQL Kaydı'ndan veri seçme:
İmleç Company_Cur'u açıklamak ...; Company_rec company_cur% RowType; Şirketin açık başlaması_cur; Company_cur company_rec;
  • İmleçten değişkene veri seçme:
New_Balance_CUR'yi New_Balance_dollars'a getirin;
  • İmleçten PL / SQL tablo dizgesine, değişken ve değişken bağlayıcı Oracle formlarına veri seçme:
Emp_name_cur'u Emp_Name (1), Hiredate,: Dept.min_Salary'ye getirin;

İmleçten seçilen veriler her zaman% RowType özniteliğine sahip aynı imleciye dayanarak bildirilen bir kayıtta yerleştirilmelidir; Değişken listelerde örneklemekten kaçının. Kayıtteki seçim, kodu daha kompakt ve esnek hale getirir, numune listesini alma komutunu değiştirmeden değiştirmenize olanak sağlar.

Son çizginin işlenmesinden sonra örnekleme

İmleci açma, tamamen yorgun olana kadar ipi seçersiniz. Ancak, ve sonra alma komutunu çalıştırabilirsiniz.

Garip bir şekilde, bu durumda PL / SQL bir istisna başlatmaz. O sadece hiçbir şey yapmaz. Seçmek için başka bir şeyiniz olmadığından, alım komut bölümündeki değişkenlerin değerleri değişmez. Başka bir deyişle, alma komutu bu değişkenlerin değerlerini NULL'ye eşit olarak ayarlamaz.

Açık bir imlecin sütunlarının takvimleri

İmlecin bildirimindeki SELECT komutu, onlara döndürülen sütunların listesini belirler. Tabloların sütunlarının isimleri ile birlikte, bu liste hesaplanan veya sanal sütunlar olarak adlandırılan ifadeler içerebilir.

Alias \u200b\u200bSütunu, bir sütun veya ifadenin Seç komutunda belirtilen alternatif bir addır. SQL * Plus'ta uygun takmeleri belirterek, keyfi bir sorgunun sonuçlarını okunabilir bir biçimde görüntüleyebilirsiniz. Bu gibi durumlarda takvimler zorunlu değildir. Öte yandan, belirsiz sözde imlecler kullanılırken, hesaplanan sütunlar aşağıdaki durumlarda gereklidir:

  • İmleçten veri seçerken, aynı imleç tabanlı% RowType niteliği ile açıklanan girişe;
  • program hesaplanan sütuna bir bağlantı içerdiğinde.

Aşağıdaki talebi düşünün. SELECT komutu, 2001 yılında mal sipariş eden tüm şirketlerin adlarını ve ayrıca toplam emir miktarını seçer (mevcut varsayılan veritabanı örneğinin DD-MON-YYYY formatlama maskesi kullandığı varsayıldığı varsayılmaktadır):

Company_Name, Sum (Inv_Amt) Company_Name, Sum (Inv_Amt) şirketinden COMP ve I.Invoice_Date "01-Jan-2001" ve "31-Dec-2001" arasında;

Bu komutu SQL * Plus'ta yürütürken, aşağıdaki sonuç elde edilecektir:

Şirket Adı. Toplamı (inv_amt)
ACME TURBO A.Ş. 1000
Washington Saç Co. 25.20

Gördüğünüz gibi, toplam sütun başlığı rapor için zayıf bir şekilde uygundur, ancak basit veri görüntüleme için oldukça uygundur. Şimdi, açık bir imleci kullanarak PL / SQL programında aynı isteği çalıştırın ve bir sütun takma adı ekleyin:

İmleci Comp_CUR, C şirketinden C.Name, Sum (Inv_Amt) Company COMP, Fatura I.Invoice I. Comp_rec comp_cur% rowType; Comp_cur'u açın; Comp_cur comp_rec içine almak; Son;

Bir takma ad olmadan, Comp_REC kayıt yapısındaki sütuna başvuramıyorum. Hesaplanan bir sütunla bir takdirme varsa, diğer herhangi bir sorgu sütununda olduğu gibi çalışabilirsiniz:

Eğer comp_rec.total_sales\u003e 5000 sonra dbms_output.putd_line ("5000 $ 'lık kredi limitinizi aştınız. || to_char (comp_rec.total_sales - 5000," 9999 $ "); Eğer biter;

Bir öznitelik% RowType ile bildirilen bir kayıt için bir dize ekilirken, hesaplanan sütuna erişim yalnızca adla elde edilebilir - sonuçta kayıt yapısı imleç yapısı tarafından belirlenir.

Açık bir imleci kapatmak

Çocukluk çağında bir kez bize kendileri için öğretildi ve bu alışkanlık bizimle (hepsi olmasa da) yaşam için ayrıldı. Bu kuralın programlamada ve özellikle imleçleri yönetme konusunda son derece önemli bir rol oynadığı ortaya çıktı. Artık gerekmiyorsa imleci kapatmayı asla unutma!

Komut Sözdizimi Kapat:

Close_name_name;

Aşağıda, açık imleçlerin kapatılmasıyla ilgili birkaç önemli tavsiye ve hususlardır.

  • İmleç bildirilirse ve prosedürde açıksa, onu tamamladıktan sonra kapatmayı unutmayın; Aksi takdirde, kodunuzda bellek sızıntısı gerçekleşir. Teorik olarak, imleç (herhangi bir veri yapısı gibi), eylem alanını terk ederken otomatik olarak kapatılmalı ve yok edilmelidir. Kural olarak, prosedürden çıkarken, işlev veya anonim blok pl / sql gerçekten tüm imleçleri gerçekten kapatır. Ancak bu işlem, belirli kaynakların belirli maliyetleriyle ilişkilidir, bu nedenle PL / SQL'in etkinliğinin nedenleri için, bazen açık imleçlerin tanımlanmasını ve kapatılmasını sonlandırır. Tanım gereği ref imleci gibi imleçler dolaylı olarak kapatılamaz. Emin olabileceğiniz tek şey, "harici" PL / SQL bloğunun sonunda, kontrolün SQL veya diğer arayanlara iade edildiğinde, PL / SQL bu ünite veya iç içe bloklar tarafından açık olan imleçleri açıkça kapatacaktır. , Ref imleci hariç. Oracle Technology Network'ten "PL / SQL Static SQL" makalesi, PL / SQL'nin imleçleri nasıl kapattığını ve ne zaman kapandığında ayrıntılı bir analiz sağlar. İç içe geçmiş anonim bloklar - PL / SQL'nin imleçlerin örtük kapatılmasını yapmadığı bir durumun bir örneği. Bu konuda ilginç bilgiler, Jonathan Ghennik "PL / SQL imleçleri kapatır mı?" Yazan makalede verilir.
  • İmleç paket paketinde ilan edilirse ve bazı blok veya programda açıksa, kapatıncaya kadar veya oturum tamamlanmadan önce açık kalacaktır. Bu nedenle, bir parti seviyesi imleci ile çalışmayı tamamlayarak, yakın komuta hemen yakın olmalıdır (ve bu arada, dışlama bölümünde de aynı yapılmalıdır):
My_package.my_cursor açık başla; ... my_package.my_cursor yakınlarındaki imleçle çalışıyoruz; İstisna, diğerleri ise MyPackage.my_cursor% ISOPEN ise My_Package.My_Cursor'u kapatın; Eğer biter; Son;
  • İmleç yalnızca daha önce açıldığında kapatılabilir; Aksi takdirde, bir Invalid_Curs0R istisnası başlatılacaktır. İmleç durumu,% ISOPEN özniteliği kullanılarak kontrol edilir:
Eğer company_cur% ISOPEN ise COSTER_CUR; Eğer biter;
  • Programda çok fazla açık imleç varsa, numaraları Open_Cursors veritabanı parametresinin değerini geçebilir. Her şeyden önce bir hata mesajı aldıktan sonra, ambalajlarda ilan edilen imleçlerin kaybolması gerektiğinden sonra kapatıldığından emin olun.

Açık İmleçlerin Özellikleri

Oracle, açık imleç durumunun durumu hakkında bilgi edinmek için dört nitelik (%,% bilgi,% izopen,% rowcountm) destekler. Özelliğe referans aşağıdaki sözdizimine sahiptir: imleç% niteliği

Burada imleç, ilan edilen imlecin adıdır.

Açık imleçlerin öznitelikleri tarafından iade edilen değerler tabloda verilmiştir. bir.

Tablo 1. Açık İmleçlerin Özellikleri

İmleç özelliklerinin değerleri, bunlarla çeşitli işlemlerin yürütülmesinden önce ve sonra tabloda belirtilir. 2.

Açık imleçlerin nitelikleriyle çalışmak, aşağıdakileri göz önünde bulundurmak gerekir:

  • İmleci açmadan önce veya kapatılmadan önce% tarafından bulunduğunuzda,% whound veya% rowcount niteliği ile iletişime geçmeye çalıştığınızda, Oracle geçersiz imleç (ORA-01001) istisnası başlatır.
  • Eğer, Fetch komutunun ilk yürütülmesinden sonra, ortaya çıkan satır seti boş olacaktır, imleç özellikleri aşağıdaki değerleri döndürür:% Bulundu \u003d false,% whitefound \u003d true ve% rowCount \u003d 0.
  • Toplu toplayıcıyı kullanırken,% RowCount niteliği, belirtilen koleksiyonlarda çıkarılan satır sayısını döndürür.

Tablo 2. İmleçlerin Özellik Değerleri

Operasyon % Bulundu % Bulunamadı % Açık. % RowCount.
Açmak Bir istisna
ORA-01001
Bir istisna
ORA-01001
Yanlış Bir istisna
ORA-01001
Açıktan sonra BOŞ BOŞ Doğru. 0
İlk örnek getirmeden önce BOŞ BOŞ Doğru. 0
İlk numuneden sonra
Almak
Doğru. Yanlış Doğru. 1
Daha önce
Almak
Doğru. Yanlış Doğru. 1
Sonraki getirildikten sonra Doğru. Yanlış Doğru. Verilere bağlıdır
Son örnek getirmeden önce Doğru. Yanlış Doğru. Verilere bağlıdır
Son örnek getirildikten sonra Doğru. Yanlış Doğru. Verilere bağlıdır
Kapatmadan önce Yanlış Doğru. Doğru. Verilere bağlıdır
Kapandıktan Sonra Bir istisna Bir istisna Yanlış Bir istisna

Tüm bu özelliklerin kullanımı aşağıdaki örnekte gösterilir:

Bloglarda daha önce, prosedürlerin ve fonksiyonların parametrelerini kullanma örnekleri art arda getirildi. Parametreler, bir yazılım modülüne ve ondan bilgi iletme aracıdır. Uygun kullanımla, modülleri daha kullanışlı ve esnek yaparlar.

PL / SQL, imleçlerin parametrelerini aktarmanızı sağlar. Aynı işlevleri, yazılım modüllerinin parametreleri ile birkaç ek olarak gerçekleştirirler.

  • İmleçlerin çoklu kullanımının genişlemesi. Sertçe yerine, nerede yan tümcesinde, veri seçim koşullarını tanımlayan değerler, bu teklifin her bir açıklığı ile bu teklife yeni değerleri aktarmak için kullanılabilir.
  • İmleçlerin kapsamı ile ilgili sorunları çözme. Sert olarak kodlanmış değerler yerine, parametreler sorguda kullanılırsa, imleç satırların elde edilen seti, programın veya bloğun belirli bir değişkenine bağlı değildir. Programın iç içe geçmiş bloklara sahipse, imleç üst düzeyde belirlenebilir ve iç içe bloklarda iç içe geçmiş bloklarda kullanırlar.

İmleç parametrelerinin sayısı sınırlı değildir. Açık ararken, imleç için tüm parametrelerin değerleri belirtilmelidir (varsayılan değerlerin tanımlandığı parametreler hariç).

İmleçler hangi durumlarda parametreler gerektiriyor? Genel kural burada prosedürler ve fonksiyonlar için aynıdır: İmlecin farklı yerlerde kullanılacağı varsayılırsa ve nerede bölümdeki farklı değerlerle parametre bunun için tanımlanmalıdır. İmlecileri parametre ve olmadan karşılaştıralım. Parametreler olmadan bir imleç örneği:

CURSOR JOKE_CUR SELECT ADI, CATECTION, JOKES'ten Last_used_Date;

Elde edilen imleç seti, Joke tablosunun tüm kayıtlarını içerir. Çizgilerin yalnızca bazı alt kümesine ihtiyacımız varsa, sorguya nerede bulunur:

CURSOR JOKE_CUR SELECT ADI, CATECTION, LAST_USE_DATE Nerede Kategori \u003d "Koca";

Bu görevi gerçekleştirmek için parametreleri kullanmadık, ancak gerekli değildir. Bu durumda, imleç belirli bir kategori ile ilgili tüm satırları döndürür. Ancak, bu çekirdeğe her çekicilikle birlikte, kategori değişir mi?

Parametrelerle imleçler

Tabii ki, her kategori için ayrı bir imleci tanımlamayacağız - bu, veri tarafından yönetilen başvurular geliştirme ilkesi ile tamamen tutarsız. Sadece bir imleciye ihtiyacımız var, ancak kategoriyi değiştirmenin mümkün olacağı gibi - ve gerekli bilgileri hala iade ederdi. Ve bu görevin en iyisi (sadece tek olmasa da) bir çözüm parametreli bir imleci tanımlamaktır:

Prosedür Açıklama_Joke (Joke_Category.Category_ID% Tipinde Main_Category_in), / * || İmleç oluşan parametrelerin listesi ile || Tek dize parametresinden. * / CURSOR JOKE_CUR (Varchar2'de Category_in) Seçin İsim, Kategori, Last_used_ted_tate of Category \u003d Yukarı (Category_in); Joke_Rec Joke_Cur% RowType; Başlangıç \u200b\u200b/ * Şimdi, imleci açarken, argüman * / Open Joke_CUR (Main_Category_in) iletilir; Joke_CUR'yi Joke_Rec'e getirin;

İmleç adı ve anahtar kelime arasında şimdi bir parametre listesi içeriyor. Sert olarak kodlanmış koca değeri, burada fıkrada (Category_in) referans olarak değiştirilir. İmleci açarken, kocanın, koca veya kocanın değerini ayarlayabilirsiniz - imleç hala çalışıyor. İmlecin şaka tablosu satırlarını iade etmesi gereken kategori adı, açık ifadede (parantez içinde) değişmez, sabitler veya ifadeler olarak ayarlanır. İmleci açma sırasında, SELECT komutu ayrıştırılır ve parametre değer ile ilişkilidir. Daha sonra elde edilen sıra seti belirlenir - ve imleç örnek için hazırdır.

Bir imleci parametrelerle açmak

Yeni imleç herhangi bir kategori ile açılabilir:

Joke_cur (jokes_pkg.category) açın; Joke_cur ("koca") açın; Joke_cur ("politikacı") açın; Joke_cur (jokes_pkg.relation || "-in-law");

İmleç parametreleri en sık nerede durumunda kullanılır, ancak diğer yerlerde bunlara başvurabilirsiniz.

İmleç Joke_CUR (Archar2'deki Category_in) bildirin. Seçin Ad, Category_in, Last_used_tate of Category \u003d Yukarı (Category_in);

Tablodan bir kategori okumak yerine, kategori_in parametresini örnek listesinde değiştiririz. Sonuç aynı kalır, çünkü durumun parametre değerinin örnek kategorisini sınırlar.

İmleç parametre alanı

İmleç parametresinin kapsamı bu imleci ile sınırlıdır. İmleç parametresi, imleçle ilişkilendirilmiş seçim komutu olarak adlandırılamaz. Aşağıdaki PL / SQL fragmanı, program_adı tanımlayıcısı blokta yerel bir değişken değildir, çünkü aşağıdaki şekilde derlenmez. Bu, yalnızca imlecin içinde tanımlanan resmi bir imleç parametresidir:

İmleci Scariness_Cur (Program_Name Varchar2) 'nin seçilidir (Scary_Level) Tales_From_The_Crypt konumundan TOPTAL_SCARY_LEVEL. Program_name başlatmak: \u003d "solunum annesi"; / * Geçersiz Bağlantı * / Open Scariness_Cur (program_adı); .... scarines_cur close; Son;

İmleç parametre modları

İmleç parametrelerinin sözdizimi, prosedürlerin ve fonksiyonların sözdizimine çok benzerdir - imleçlerin yalnızca parametreler olabilmesi dışında. İmleçler için, çıkış veya çıkış modlarını belirtemezsiniz. Bu modlar, imleci için anlam ifade etmediği prosedürlerden değerleri aktarmanıza ve iade etmenizi sağlar. İmleçten bilgi edinmenin tek yolu var: Bölümdeki sütun listesinden kayıt ve kopyalama değerleri seçimi

Varsayılan parametre değerleri

İmleç parametreleri varsayılan değerlerle atanabilir. İmleç örneği Varsayılan parametre değerine sahip:

İmleç EMP_CUR (EMP_ID_IN numarası: \u003d 0) Çalışan_id \u003d emp_id_in;

EMP_ID_IN parametresi için varsayılan değer tanımlandığından, değerini alma komutundaki değerini belirtemezsiniz. Bu durumda, imleç, çalışan hakkında bilgi 0 koduyla iade edecektir.