Internet Derazalar Android
Kengaytirmoq

Burun - SQL-da kursorlar va tsikllardan foydalaning. Sql serveridagi mysql kursorlarida kursorlar

1) Kursor tushunchasi
Interaktiv SQL-da, bitta chiziqli va ko'p chiziqli so'rovlar o'zgarmaydi. O'rnatilgan SQL-da, ushbu so'rovlar turli yo'llar bilan amalga oshiriladi. Bir martalik so'rovlar bitta qatorni qaytaradi va biz allaqachon ko'rib chiqdik. So'rovning ijrosi natijasi bir qator bo'lmasa, o'rnatilgan SQL so'rov natijalarini chiziqli qabul qilish imkoniyati bilan ta'minlashi kerak. Buning uchun kursorlar ishlatiladi. Kursor ostida so'rov bilan bog'liq o'zgaruvchi degan ma'noni anglatadi. Uning qiymati so'rovni qoniqtirgan har bir satr. O'zgaruvchilar singari, ulardan foydalanishdan oldin kursorlarni tasvirlash kerak. Ko'rishlardan farqli o'laroq, kursorlar chizishga mo'ljallangan.

2) Kursor e'lon

Deklaratsiya qiling. [{}] [[Yo'q] Aylantirmoq] Kursor. [{Bilan |siz |} Tutmoq] Uchun [Uchun {Faqat | yangilanish [. ]}]

3) Kalit so'zlar
. Sezgir | befarq | Assividir - Olingan to'plamdagi o'zgarishlar ko'rinadi | Bu taqiqlangan (ma'lumotlar to'plamining nusxasi yordamida belgilangan) | DBMMS o'zi nusxasini yaratishga qaror qiladi (aslida haqiqiy).
. Bilan | ushlab qolmasdan - Barglar ochildi | Agar komisor bajarilgan bo'lsa, kursorni yopadi.
. Aylantirmoq - natija liniyalarini o'zboshimchalik bilan tartibda chiqarib olish uchun [taqiqlaydi].
. Faqat o'qish uchun - Kursorni faqat o'qish uchun belgilaydi.
. Yangilash uchun. - Faqat belgilangan ustunlar yangilanishdan to'smoqda.

4) SQL serveridagi kursor e'lon

Deklaratsiya qiling. Kursor. [Mahalliy | Global] [Oldindan_only | O'chking] [Statik | Keycation | Dinamik | Fast_Frefing] [Read_only | scrol_loks | optimistik] Uchun [Yangilanish uchun. [. ]]

. Statik. - Kursordan foydalanish uchun ma'lumotlarning vaqtinchalik nusxasini yaratadigan kursorni belgilaydi. Kursorning barcha so'rovlari belgilangan vaqt bazalari bo'yicha so'rovlar ko'rsatilgan, shuning uchun belgi jadvallarini o'zgartirish ushbu kursor uchun namunalarning namunalariga ta'sir qilmaydi va kursorning o'zi o'zgarishga imkon bermaydi.
. Tugmachali. - Kursorda a'zolik yoki buyruqlar uning ochilishidan keyin o'zgarmaydi. Vaqtni aniq belgilab qo'yilgan tugmachalar to'plami TheMetsets nomidagi ma'lumotlar bazasida stolga o'rnatilgan.
. Dinamik - Ushbu kursorni ko'rayotganda stron iplarida keltirilgan barcha ma'lumotlarni namoyish qilish kursorini belgilaydi. Ma'lumot qiymatlari, tartibi, shuningdek har bir namunada qator a'zolik farq qilishi mumkin. Mutlaq tanlab olish parametrlari dinamik kursorlar tomonidan qo'llab-quvvatlanmaydi.
. Tezda oldinga - Amaldagi optimallashtirish yoqilganligi uchun, so'rovnomani oldinga surish_only kursorini belgilaydi. Fast_Fruard parametrini o'ram yoki for_pdat parametrlari bilan belgilab bo'lmaydi.
. Aylantirish_LOLLAR. - Kursor orqali amalga oshiriladigan joylashtirilgan yangilanishlar yoki olib tashlash muvaffaqiyatli bo'lishi uchun kafolatlanadi. SQL serveri kursorni keyingi o'zgarishlar uchun mavjudligini ta'minlash uchun kursor sifatida satrlaydi. Scroll_Llocks parametrini tezkor yoki statik parametr bilan belgilab bo'lmaydi.
. Optimistik - Joylashtirilgan yangilanishlar yoki kursor orqali amalga oshirilgan o'chirishlar kursorni o'qishdan so'ng satr yangilangan bo'lsa, kursor orqali amalga oshirilmaydi. SQL serverlari kursorga o'qilganda iplarni bloklamaydi. Buning o'rniga, satr kursorni o'qib bo'linganidan keyin o'zgarganligini aniqlash uchun Vaqtning orzusining ustun qiymatlari taqqoslanadi (yoki Times ustuni bo'lmasa). Agar satr o'zgartirilgan bo'lsa, uning joylashishi yoki olib tashlash mumkin emas. Optimistik parametrni tez_orward parametri bilan belgilab bo'lmaydi.

5) Kursorni ochish

6) qatorlarni kursordan ajratish

Tanbeh [{Keyingi | Oldin | Avval|{Mutlaqo | qarindoshi. }}]
Dan. Ichiga

7) kursorni aniqlash variantlari
. Keyingi | Oldin | Avval - Keyingi | Oldingi | avval | Dastlab olingan to'plamning oxirgi qatori.
. Nisbiy ± N. - joriy chiziqqa nisbatan ijobiy yoki salbiy ofset bilan satrda.
. Mutlaq ± N. - Kursorning boshidan yoki oxirida aniq belgilangan mutlaq sonli satrda.

Eslatma: Sql serverida N, o'rniga butun sonning o'zgaruvchisi @n.

8) Kursorni yopish

9) kursorlarda eslatma
. Agar kursor tarkibida bir nechta qator bo'lsa, u oxirgi satrga erishish uchun qo'shimcha tekshiruvni o'tkazish uchun qo'shimcha tsiklni tashkil qilish kerak.
. Jadvallardan farqli o'laroq, kursorli satrni aniq ishlatish uchun buyurtma berish tartibi Buyurtma bo'yicha.yoki ma'lum bir dBMSda qabul qilingan shartnomalarga muvofiq.
. Kursorlar, shuningdek, yangilanishi yoki o'chirilishi mumkin bo'lgan strings guruhlarining namunalaridan namuna olishadi.
. Kursor yangilanishi uchun, taqdimot, ya'ni bo'linmada, ya'ni, ya'ni bir xil mezonlarni qondirishi kerak Ittifoq, buyurtma bo'yicha, guruh bilan guruh.

10) Kursordan ma'lumotlarni o'chirish uchun misol

ixtorlik SQL BUYURTMACHI Kursor Kursni tanlang
Qaerda reyting.
// Chop etish (@ F1 + '' (Varchar (5), @ F2))
Mijozdan SQL-ni o'chirish
CUR1 ning oqimi bo'lgan joyda; ) - kursordan olib tashlash uchun ma'lumotlar
emas_don:
INDP SQL kursor Kure1; - O'lchamini yoping
Chiqish ();

11) Komissiyaning ko'payishi misoli

sQL Speallardan tanlang * Speals-ni tanlang *
Snum ichidagi (Mijozdan Snumni tanlang \u003d 300); - Kursorni aniqlang
ISHLAB CHIQARISH Kursor kutish; - Kursorni bajaring
Vaqt (Sqlca.SQLCode \u003d\u003d 0) (- jadvaldagi ma'lumotlarni yangilash uchun loopni yarating
SQL-SQL Fetchni qisqartirish: Id_num ,: Soteti ,: Sotherson, poda;
ISHLAB CHELD SQL yangilanishi SHTEALALONAL SET \u003d Kompyuterni o'rnating
kutish; ) - kursordan olish uchun yangilash uchun ma'lumotlar
ISHLAB CHIQARISH Kursor kutish; - O'lchamini yoping

Scelect S.Name, Max (S.Fity) SHM (O.At) S.Name buyurtma bo'yicha S.Name buyurtma bo'yicha S.Name buyurtmasi bo'yicha S.Snum \u003d O.Snum guruhiga qo'shilish buyruqlari

S. S.Name-S.Naleops (O.Name) uchun S.Name S.Name Buyurtma-da, S.Name buyurtmasi uchun AMT sifatida S.Name (O.Snum guruhi) ni tanlang.
Ochiq egri.
Egri chiziqdan keyingi
@@ fitch_status \u003d 0
Boshlanishi.
Egri chiziqdan keyingi
Oxiri.
Yopish1 yoping1.
Dilat 1

Kursorlar guruhi bizga dasturxondan manipulyatsiya qilish uchun yozuvlarni chiqarib olishga imkon beradi. Bu SQL tomonidan amalga oshiriladigan ma'lumotlar to'plamlarini an'anaviy qayta ishlash o'rniga qurilishni qayta ishlashga imkon beradi.

Birinchi yondashuvda kursor bilan ishlashda quyidagi amallardan foydalaniladi.

Kursor e'lon qilish buyrug'i bilan yaratiladi. Kursor ochiq buyruq bilan ochiladi.

Kursor operatsiyalari Fetch buyrug'i yordamida ishlab chiqariladi. Kursor yopish buyrug'i bilan yopiladi.

Kursor buyrug'i tanlangan bayonotni bildiradi. Har bir satrni tanlash bayonoti tomonidan qaytarilishi mumkin va individual ravishda qayta ishlash mumkin. Oracle uchun quyidagi misolda kursor reklama blokida boshqa bir nechta o'zgaruvchilar bilan birga e'lon qilinadi. Shundan so'ng, keyingi boshida ... tugashi bilan kursor ochiladi, u unga tanlab olinadi va kursor yopiladi.

Kursor sarlavhasi_Pree_Cursor sarlavhasi, narxlar frotles-ni tanlang

Yaqin narx nolga teng emas; sarlavha_pree_val sarlavhasi_pree_cursorpe; New_Price raqami (10.2);

Ochiq sarlavha_prece_cursor;

Sarlavha_Prece_Valga olingan sarlavha_pregat_cur-sor;

new_Price: \u003d "Sarlavh_Val.Prece" * 1.25 yangi_title_pringe qiymatlariga ulang

(Sarlavh_Pree_Val.title, New_Price) Yopish chempionligi_Pree_Cursor; Oxiri;

Ushbu misoldan beri PLA / SQL foydalanadi, biz ushbu kitobda ushbu kitobda tushuntirmaymiz. Biroq, kursor reklamasi e'lon blokida aniq ko'rinadi. Bajariladigan blokirovkada PLA / SQL-da kursor ochiq buyruq bilan boshlanadi, qiymatlar Fetch buyrug'i bilan olinadi va nihoyat, kursor yopiq buyruq bilan yopiladi.

Tanlash bo'yicha ko'rsatmani kursorning asosidir, shuning uchun mohirona kursorning ko'rsatmalariga qo'shilishdan oldin uning sinchkovlik bilan sinovdan o'tish. Tanlash qo'llanmasi asosiy jadval yoki vakillik bilan ishlashi mumkin. Shuning uchun o'qish faqat kursorlari keraksiz g'oyalar bilan ishlashi mumkin. Agar ushbu takliflar manba jadvalini yangilamasa, varag'ida vasiyatni tanlash kabi takliflar bo'lishi mumkin. Agar kursor yangilashga kelsak, tanlangan bayonotdan bunday takliflarni o'chirish tavsiya etiladi.

Mahalliy kursorlar ko'pincha saqlanadigan protseduralarning chiqish parametrlari sifatida ishlatiladi. Shuning uchun, saqlanadigan protsedurada siz kursorni aniqlash va to'ldirishingiz va uni paketli vazifa yoki saqlangan protseduraga o'tkazishingiz mumkin.

Db2 uchun navbatdagi oddiy misolda biz kafedralarni ko'rib chiqamiz, bo'limlarning ismlarini, idoralar nomlarini va admin_group "Ho1" menejerlarining raqamlarini e'lon qilamiz.

Destt_cursor kursorini e'lon qiling.

Com_nb, koft_name-ni tanlang, mgr_nb

Qayerda admen_group \u003d "x01"

D "elet_name Askur, Dept_nb desc, mg_nb desc;

Keyingi misolda, Microsoft SQL serveri e'lon qilinadi va noshirlar jadvali uchun kursor ochiladi. Kursor noshirlar jadvalining birinchi yozuvini tanlaydi, tegishli tanlovni tanlash va uni boshqa jadvalga ulaydi. Keyin u keyingi rekordga, \u200b\u200bso'ng keyingisiga - barcha yozuvlar qayta ishlanmaguncha. Va nihoyat, kursor xotirani yopadi va chiqaradi (faqat Microsoft SQL serverida ishlatiladi).

Deb e'lon qiling @Publisher_name Virar (20)

"USA" mamlakati bo'lgan Nashriyotlardan pub_name-ni tanlang.

Pub_Cursordan Nashriyot_name-ga keling

@S\u003e Fetch_status \u003d 0

Xorijiy_pumlanders qiymatlariga qo'shing ("J\u003e Nashriye_name)

PUB_Cursorni yoping Pub_Cursor

Ushbu misolda, kursor yozuvlar to'plamini ko'rishingiz mumkin. (Ushbu misolni faqat ushbu g'oyani namoyish etish uchun mo'ljallangan, chunki aslida ushbu vazifani hal qilishning yaxshiroq usuli mavjud, ya'ni qo'shish, bayonotni tanlang.)


Kursor - kontekstual xotira zonasiga havola. SQL dasturlash tilining ba'zi dasturlarida (Oracle, Microsoft SQL serveri), natijada o'rnatilgan yozish joyi va u bilan bog'liq bo'lgan joriy yozib olish ko'rsatkichlari bajarilgan. Bu kursorning alternativ ma'lumotlar ombori bo'lgan virtual jadval. Bunday holda, kursor sizga oddiy qator ma'lumotlariga murojaat qilish imkonini beradi.
Kurslar saqlangan tartibda ishlatiladi. Chiroyli nazariyalar, masalan, misolni ko'rib chiqaylik:
Bizda ma'lumotlar bazasi bor (bazasi juda yaxshi emas, bu laboratoriya ishlarimdan biridir, ammo ma'lumotlar bazalarida o'qituvchimiz bunday tuzilishga chiqdi)
/ * Bank ma'lumotlari * /
"Bank" jadvalini yaratish (

"Bankname" Varra (50) UtF8_bin nulton emas ""


Birlamchi kalit ('bankid')

) Dvigatel \u003d innoDB
"UTF8" to'plamini belgilash "Utf8_bin";
/ * Depozit ma'lumotlari * /
"BankdaDistsiya" jadvalini yaratish (
"Bankid" butun son (11) nol emas,
"Portent" butun sonini (11) standart nol,
"Qarzi" Oyki o'nlik (10,0) nol emas,
"MijozID" butun son (11) nol emas,
Birlamchi kalit ('bankid', `mijozd),
"Bankid" kaliti ("Bankid",
Kalit `mijozid ('Calcued'),
Chet ellik Kaliti (Banksistribor_fk) ("Bankid ')" Bankning (bankid') havolalari,
Chet ellik Kaliti ("MijozID '") "Mijoz" havolalari "Mijoz" ("MijozID" havolalari
) Dvigatel \u003d innoDB
/ * Omonat ma'lumotlari * /
Jadval yaratish "Mijoz"
"MijozID" butun son (3) Null Auto_increment,
"Kredit kartaid" kattasi (10) nol emas,
"Familame" Familiya (50) UtF8_bin nulton emas ""
"Namchiroq" FARFAR (50) Utf8_bin nulton emas "",
"FirmName" Varra (50) UtF8_binni nulton emas ""
"Telefon` telefonlari" (50) Utf8_binni null standart emas ""
"Manza" Manro (50) Close UTF8_BIN-ni o'chirib qo'ymang ",
"Seryid" butun sonni (5) nol emas,
Birlamchi kalit ("Salimer", "KreditCardid",
Kalit `mijozid '(` CN SOLEID')

) Dvigatel \u003d innoDB
Auto_increment \u003d 11 Belf8 "UtF8_bin" to'plamini belgilash

Aytaylik, biz har bir bankni aylanib chiqishimiz va u bilan qandaydir harakatlarni etishtirishimiz kerak deb o'ylaymiz

"Bank" ni tanlang. * 'Bankning chegarasi_name_name_sapsie, 1
. Shunday qilib, 1-sonli cheklov raqamidan foydalangan holda, siz har bir yozuvda stolda tsiklda olib tashlaymiz, agar biz bir xil ishni ko'paytiramiz. Endi biz ham shunday qilamiz, ammo biz ham shunday qilamiz, ammo kursordan foydalanamiz
Boshlanishi.
/ * o'zgaruvchilar biz ma'lumotlarni ajratib qo'yadigan * /
VBANKID butun sonini e'lon qiling;
Vbankname Varchni (50) e'lon qiladi;
Vaddress Varcharni (50) e'lon qiling;
Vararni e'lon qilish (50);
/ * o'zgaruvchan Hadler - a * /
Standart butun sonni e'lon qildi;
/ * Kursor e'lon * /
BankCursor kursorini "Bankning" banki uchun "Bank", "Bank" "Bank", "Bank", "Bank", "Bank", "Bank", "Bank", "Bank", "Bank", "Bank", "Bank", "Bank" ning 1-dan 1-bandda ko'rsatilgan.
/ * Qo'llaniladigan tayinlash * /
"02000" to'plamiga ishlov beruvchini davom ettirishni e'lon qilish \u003d 1;
/ * Kursorni ochish * /
Banksorkorsorni ochiq Banksor
/ * Ma'lumotlarni o'chirish * /
Bajarilganda \u003d 0 qiling

Biz kerak bo'lgan harakatni qilamiz
Oxirida tugaydi;
/ * Kursor yopish * /
Qopqoq Banksorkor;
Oxiri;

* Ushbu manba kodi dastlabki kod bilan ajratilgan.

Xato: 1329 kvlstate: 02000 (er_sp_fch_no_data)

Xabar: Hech qanday ma'lumot yo'q - nol qatorlar tanlangan, tanlangan yoki tartibsiz

SQLstate: 02000 tetiklashtiruvchi kursorga etib borganda yoki tanlash yoki yangilashda bo'sh satrni qaytaradi.

Keyingi qatorda biz tanlangan_statsion kursor uchun kursor_name kursorini e'lon qildik;
Ochiq kursor_name kursorini oching;
Keyinchalik, biz ma'lumotlarni olish va ularni qayta ishlash orqali biz kursorning oxirigacha (bajarilganda) oxirigacha erisha olmaymiz.
Saqlangan protsedurani tark etishdan oldin, kursorni yopishingiz kerak. Kursor_name-ni yoping;

Bu murakkab narsa emas. Ammo SQLSTATTATIDA "02000" bilan juda ko'p bo'ronlar bog'langan.

Bajarilganda \u003d 0 qiling
Bankkurorni VBankid, VBankname, VadDrress, VEMS-ga olib boring;

BankDistardan VCONTRUALALUATSUMNI (hissa qo'shing) bankida \u003d vbandid 1-sonli cheklovni tanlang;
ba'zi harakatlar qiling
Oxirida tugaydi;

* Ushbu manba kodi dastlabki kod bilan ajratilgan.


Hammasi yaxshi va sintaksis nuqtai nazaridan to'g'ri. Ammo mantiqiy ko'rinishga ega emas. Omonatchilar ba'zi banklarda hisobvaraqlarni ochishlari uchun, keyin BankDistribe Sanxutsumum uchun hisobni ochishmagan, bu erda BankDistributieMoumum uchun bankDen \u003d VBANKID 1; SQLSTATTATSI ishlaydi: 02000, amalga oshirilgan o'zgaruvchi 1 va tsiklni kutganimizdan oldinroq bo'ladi. Buni asrab olishdan qochish mumkin.
Bajarilganda \u003d 0 qiling
Bankkurorni VBankid, VBankname, VadDrress, VEMS-ga olib boring;
/ * Bankni uning omonatlari miqdorini olish * /


agar (vcontributsum\u003e 0) keyin
/ * Bankni uning omonatlari miqdorini olish * /

tugashi bilan tugaydi;
ba'zi harakatlar qiling
Oxirida tugaydi;

* Ushbu manba kodi dastlabki kod bilan ajratilgan.


Biz birinchi so'rovni tekshirdik va omonatlar bo'lsa (agar VCONTRIRUTSULSUMUMUMERN bo'lmasa (0) va agar ular bo'lsa, biz ma'lumotlarni ajratib qo'yamiz.

Endi aytaylik, har bir mijoz uchun turli xil banklardagi hisob qaydnomasida umumiy miqdorni davolashimiz kerak
Sumni tanlash uchun mijozlarmmarsion kursorni e'lon qiling

Summatsiya uchun mijozlararo kursorni ("BankdaDarsiya" -ni tashkil etish uchun "BankdaDistorsiya" ni (mijozdstribortions.`crientsiya) "BankdaDistsiya" ga qo'shiling. "Solxiv";

Ochiq mijozlarMakuror;
Bajarilganda \u003d 0 qiling
Bankkurorni VBankid, VBankname, VadDrress, VEMS-ga olib boring;
/ * Bankni uning omonatlari miqdorini olish * /
Bankdografsiyadan VCONTRUALEALTSUMMOM-ga Socation (hissasi) -ni tanlang. Bu erda banksin \u003d vbankid 1;
/ * Ushbu bankda hissalar mavjudmi yoki yo'qligini tekshiring * /
agar (vcontributsum\u003e 0) keyin
/ * Bankni uning omonatlari miqdorini olish * /
BankDistardan VCONTIRIBUALUUALUUALUUALUALUALUALUALUALUALUALUALUALUALUALUALUTSUMNI KO'RSATMAYDI 1. VBANKID 1;
tugashi bilan tugaydi;


Ba'zi harakatlar qiling.
Oxirida tugaydi;

* Ushbu manba kodi dastlabki kod bilan ajratilgan.

Xuddi shu holat ARTURMURSOR kursoridagi ma'lumotlar Banksmroksor ma'lumotlaridan oldin tugagach, SQLstate-ni ishga tushirganda, SQLSTATE: 02000, amalga oshirilgan o'zgaruvchi 1 va tsikl biz kutganimizdan oldin o'rnatiladi. Buni asrab olishdan qochish mumkin.

Ochiq mijozlarMakuror;
Bajarilganda \u003d 0 qiling
Bankkurorni VBankid, VBankname, VadDrress, VEMS-ga olib boring;
/ * Bankni uning omonatlari miqdorini olish * /
Bankdografsiyadan VCONTRUALEALTSUMMOM-ga Socation (hissasi) -ni tanlang. Bu erda banksin \u003d vbankid 1;
/ * Ushbu bankda hissalar mavjudmi yoki yo'qligini tekshiring * /
agar (vcontributsum\u003e 0) keyin
/ * Bankni uning omonatlari miqdorini olish * /
BankDistardan VCONTIRIBUALUUALUUALUUALUALUALUALUALUALUALUALUALUALUALUALUALUTSUMNI KO'RSATMAYDI 1. VBANKID 1;
tugashi bilan tugaydi;
/ * Ikkinchi kursordan ma'lumotlarni olishdan oldin biz SQLstate holatini eslaymiz * /
Old_status \u003d Bajarildi;
/ * Kerak bo'lgan ma'lumotlarni olib tashlang * /
Vsum, vclenteidga kiruvchi mijozlarm kombayn
/ * Ma'lumotlar olinayotganligini tekshirish, 0200 * /
agar (Bajarildi \u003d 0) keyin
Ba'zi harakatlar qiling.
tugashi bilan tugaydi;
/ * Eastonovga, o'zgaruvchisining qiymati tugashidan oldin * /
o'rnatilgan \u003d eski_status;
Oxirida tugaydi;

* Ushbu manba kodi dastlabki kod bilan ajratilgan.

Bu joydan oldin rahmat, umid qilamanki, bu kimdir foydalidir.

Reeca M. Riordan "Trantac-SQL-da kursorlar"

Axborot texnologiyalarining Internet universiteti

http://www.intuit.ru.

O'quv kursi: "Microsoft SQL serverida dasturlash"

Kursor - bu dasturlarda va saqlanadigan protseduralarda foydalanish uchun mo'ljallangan maxsus SQL vaqt. U bilan har bir qatorda bir necha ketma-ket o'qish va qayta ishlash natijasida olingan satrlar to'plamidan o'tish mumkin. Saqlangan protseduralarda kursorlardan foydalanib, siz tanlangan bayonnomadan foydalanib, tanlangan bayonotdan foydalanish qiyin bo'lgan murakkab hisob-kitoblarni amalga oshirishingiz mumkin. Darsning katta nazariy materiallari juda yaxshi misollar bilan to'ldiriladi. Xususan, kursor_status funktsiyasidan foydalanish, @@ kursor_rows va @@ Fetch_statusning tavsifi va boshqa narsalar.

Siz o'rganasiz:

  • kursor;
  • kursorni oching;
  • kursorni yoping;
  • kursorni chiqaring;
  • oddiy fayllar buyrug'idan foydalaning;
  • satrni o'zgaruvchilar ichiga olish;
  • uning mutlaq pozitsiyasida satrni tanlash;
  • uning nisbiy pozitsiyasida satrni tanlash;
  • pozitsiyani o'zgartirishni amalga oshirish;
  • pozitsiyani olib tashlash;
  • bir nechta kursordagi qatorlar sonini aniqlash uchun global o'zgaruvchi @@ kursor_rows-dan foydalaning;
  • fetch buyrug'ining natijalarini aniqlash uchun global @@ Fetch_status o'zgaruvchisidan foydalaning;
  • kursor holatini so'rash uchun kursor_status xususiyatidan foydalaning.

Ma'lumotlar bazalarining o'ziga xos xususiyatlaridan biri bu harakatlar satrlar to'plamidan yuqori bo'ladi. To'plam bo'sh bo'lishi mumkin yoki faqat bitta ipni o'z ichiga olishi mumkin, ammo u hali ham to'plam deb hisoblanadi. Bu haqli operatsiyalar uchun zarur va foydali va foydali mulk, ammo ba'zida talabnomalar uchun juda qulay bo'lmasligi mumkin.

Masalan, to'plamdagi ma'lum bir satrni belgilash imkoniyati yo'qligi sababli, bir vaqtning o'zida torlar foydalanuvchisiga qarab qiyinchiliklarga olib kelishi mumkin. SQL SQL tiliga berilgan trantata-SQL kengaytmalari sizga ko'proq dasturlash imkoniyatlarini amalga oshirishga imkon beradi, ammo ular to'plamlar bilan ishlash printsiplari asosida bajarilishi qiyin, mehnatsevar yoki hatto imkonsiz bo'lib qoladi.

Bunday vaziyatlarni engish uchun kursorlar SQL-da taqdim etiladi. Kursor bir to'plamdagi ma'lum bir satrni ko'rsatadigan ob'ekt. Siz yaratgan kursorning mohiyatiga qarab, kursorni ma'lumotlarni to'plash va o'zgartirish yoki o'chirish uchun siz yo'nalishingiz mumkin.

Kurslar tushunchasi

Microsoft SQL serveri haqiqatan ham ikki xil kursorlarni qo'llab-quvvatlaydi: trantact-sql kursorlari va API kursorlari (dasturiy dasturlash interfeyslari). API kursorlari Microsoft ActiveX ma'lumotlari (ADO) ob'ektlari, Ole-DB, ODBC yoki DB-Kutubxonadan foydalangan holda dastur ichida yaratilgan. Ushbu apislarning har biri bir nechta turli xil xususiyatlarni qo'llab-quvvatlaydi va boshqa sintaksisdan foydalanadi. Bu erda biz API kursorlarini batafsil muhokama qilmaymiz; Agar siz ulardan foydalanishni rejalashtirmoqda bo'lsangiz, API va dasturlash uchun dasturlash tilida tegishli hujjatlarga murojaat qiling.

Trantac-SQL kursorlari kursor buyrug'i yordamida yaratilgan. Kursor ob'ekti va u ko'rsatadigan ko'plab satrlar serverda mavjud bo'lishi kerak. Bunday kursorlar server kursorlari deb ataladi. Agar siz SQL-serverga ulangan dasturdan foydalansangiz, kursor bilan ishlaydigan har bir operatsiya ikki tomonlama tarmoqlarning o'zaro ta'sirini talab qiladi. Server kursorlarini qo'llab-quvvatlaydigan API-Kursor kutubxonalari, shuningdek, mijoz tizimida mavjud bo'lgan mijozlar kursorini qo'llab-quvvatlaydi va mijozning mijozni qayta ishlayotgan chiziqlar bo'ladi.

Kursor ko'rsatadigan ko'plab satrlar tanlov buyrug'i yordamida aniqlanadi. Tanlov-SQL kursorini tanlash buyrug'iga bir nechta cheklovlar juda katta cheklovlar mavjud:

tanlash buyrug'i bir nechta natija to'plamlarini qaytara olmaydi;

tanlash buyrug'i yangi jadval yaratish uchun iborani o'z ichiga olmaydi;

tanlash buyrug'i unumdor natijalarga olib keladigan ibora bilan hisoblash yoki hisoblash mumkin emas. (Ammo, u, masalan, avgust, masalan, AVG bo'lishi mumkin.)

Kursorlarning xususiyatlari

Transcal-SQL bir nechta turli xil kursorlarni qo'llab-quvvatlaydi. Kursorlarning har xil xususiyatlarini aniqlash juda zerikarli vazifadir, agar siz har bir kursorning har bir turi uchun hisobga olinsangiz, yana uchta yoki kam mustaqil xususiyatlar: manba ma'lumotlaridagi o'zgarishlarni aks ettirish qobiliyati, Turli xil iplarni aylantirish, shuningdek, o'rnatilgan chiziqlarni o'zgartirish qobiliyati.

O'zgarishlarning aks ettirish

Kursorning ma'lumotlardagi o'zgarishlarni aks ettirish qobiliyati kursorning sezgirligi deb nomlanadi. Aytaylik, siz operator kursorini yaratdingiz:

Chap (yog'siz, 1) \u003d "b" yog'laridan tanlang. 1-rasmda ko'rsatilgandek to'rt satrni qaytaradi. Agar kursoringizdan foydalanish jarayonida biron bir kishi Bergamot elementi uchun tavsif qiymatini qo'shsa yoki Bo'ryus elementi uchun satrni qo'shsa, kursoringiz ko'rsatadigan ko'plab iplar bilan nima bo'ladi?

Anjir. 1. Aroomaterapiya ma'lumotlar bazasida B harflaridan boshlanadigan to'rtta chiziq mavjud.

Kursorni yaratishda ikki xil sezgirlikning ikki turi mustaqil ravishda aniqlanishi mumkin: qanday qatorlar to'plamiga (bir nechta) va manba liniyalaridagi o'zgarishlarning aks ettirishini qanday o'zgartirish mumkin.

Aylantirish

Kursorning ikkinchi belgisi - bu oldinga va oldinga yoki faqat oldinga o'tish qobiliyati. Dasturlash uchun solenit dilemma: moslashuvchanlikka qarshi tezlik. Ketma-ket kursorlar (faqat oldinga) ishlaydi, ammo kamroq moslashuvchanlikka ega.

Yangilamoq

Kursorlarni tasniflash uchun ishlatiladigan oxirgi belgi - bu kursor bilan ipni yangilash qobiliyati. Yana, "faqat o'qish" kursorlari odatda yanada samarali, ammo kamroq moslashuvchanlikka ega.

Kurslar turlari

Transkact-SQL to'rt xil kursorlarni qo'llab-quvvatlaydi: statik, kalit, dinamik va tezkor kirish kursorlari yoki firemoce. Har bir kursor turi, qo'shimcha ravishda, qo'shimcha ravishda, har bir kursorning har bir turi oldingi bo'limda muhokama qilingan xususiyatlarning turli kombinatsiyasi bilan tavsiflanadi.

Statik kursorlar

Statik kursorni tanlash bayonotida belgilangan ma'lumotlarning suratlarini yaratadi va ularni tempda ma'lumotlar bazasida saqlaydi. Bu "strukturada yoki ma'lumotlar qiymatidagi o'zgarishlarni his qilmaydi va har qanday o'zgartirishlar faqat nusxalarda aks ettiriladi, bu kursor har doim" Faqat o'qish "rejimida ochiladi. Statik kursorlar, ammo izchil yoki aylantirish sifatida e'lon qilinishi mumkin.

Kalit kursorlari

Kalit kursori faqat har bir satrni noyob aniqlangan vasvasalar bazasiga faqat ushbu ustunlarni nusxalaydi. Kalit kursorini e'lon qilish uchun, ushbu tanlangan bayonotni aniqlashda bo'lgan har bir stol kalitning kalitini o'rnatadigan noyob indeksga ega bo'lishi kerak.

Kalit kursorlari o'zgartirilishi va "faqat o'qish faqat" rejimida bo'lishi mumkin. Ular shuningdek aylantirish yoki ketma-ket bo'lishi mumkin.

Kalit kursoriga a'zolik kursor e'lonida belgilanadi. Agar satrni tanlash holatini qondiradigan kursorning ochiq holatida satr qo'shilsa, u to'plamga qo'shilmaydi. Oldingi misolda, chapda (moyil, 1) \u003d "B" nomi "Bo'rki maydon" bilan yangi liniya kursor sohasiga tegishli yangi satrlarga qo'shilmaydi.

Shunga o'xshab, agar o'zgarishlar satrga kiritilgan satrga kirsa, masalan, "Kumquat" ni "Bazil" almashtirilishi, satr hali ham to'plamga ega bo'ladi. Agar satr olib tashlangan bo'lsa ham, u hali ham to'plam a'zosi bo'lib qolmoqda, ammo SQL serveri barcha ustunlik qiymatlari uchun NULLni qaytaradi.

Kursor ochilgandan so'ng bir nechta kursorga a'zo bo'lish, ammo manba jadvallariga kiritilgan ma'lumotlar qiymatidagi o'zgarishlar aks etadi. Masalan, Bergamot satriga tavsif konining qiymatini o'zgartirish kursorga qaytariladi. Biroq, bir nechta tugmachalar to'plamidagi o'zgarishlar kursorlarda faqat kursor ichida olib borilgan bo'lsa, o'z aksini topadi. Oldingi misolni davom ettirishda, agar moyuyom konining qiymati "basquat" dan "KUMUMQAT" dan "KUMUMQAT" dan "KUMGAT" ga o'zgartirilsa, kursor "KUMPAT" ni qaytaradi. Agar boshqa foydalanuvchi tomonidan o'zgartirilgan bo'lsa, kursor hali ham "Parig'i" ni qaytaradi.

Kengash. Keyingi qismda biz ko'radigan darajada, kursorni yaratish va kursorning ochilishi turli xil operatsiyalardir. Kalit kursorining tarkibini yangilash uchun uni yopishingiz va qayta ochishingiz mumkin.

Dinamik kursorlar

Dinamik kursor har safar tanlangan bayonotni qayta bajargan holda har safar kirish paytida o'zini tutadi. (Aslida hammasi boshqacha sodir bo'ladi, ammo bu spektakl dinamik kursorlarning ishini yaxshiroq baholashga imkon beradi) Dinamik kursorlar a'zolik va dastlabki ma'lumotlarning qiymatlari bilan bog'liq o'zgarishlarni nazarda tutadi boshqa foydalanuvchi.

Dinamik kursorlar uchun bitta chegarasi bor: kursorni aniqlash uchun ishlatiladigan iborasi tartibda tartibda ishlatiladigan ustunlarni o'z ichiga olgan indeks bilan tartibda bo'lishi mumkin. Agar siz indeksni ishlamaydigan iborasi bilan kalit kursorini bildirsangiz, SQL Server kursorni kalitga o'zgartiradi.

Tezkor kirish kursorlari

SQL Server faqat o'qish imkonini beradigan ekskursiya bo'lmagan kursorning maxsus optimallashtirilgan shaklini qo'llab-quvvatlaydi. Kursorning bu nuqtai nazari tez_orward kalit so'zi yordamida e'lon qilinadi va ko'pincha u "Firehose" kursor deb nomlanadi.

O't o'chiruvchilar juda samarali, ammo ular ishlatilganda ikkita muhim cheklov mavjud. Birinchidan, agar siz matnli ustunlar, NTExt yoki rasm ma'lumotlari turi-ni ishlatsangiz, SQL Server iborasi kursorni kalitga o'zgartiradi.

Ikkinchidan, agar siz kursorni aniqlagan tanlangan bayonnomada siz kiritgan jadvallar mavjud bo'lsa, ulanmagan jadvallar va strelka statistika statik joyga aylantiriladi. Ma'lumotni boshqarish Til (D.MM) stolini (D.MM) ish haqi bo'lgan operator tomonidan avtomatik ravishda bajariladigan trangger-sql skriptlari. Batafsil tafsilotlar Biz 29-sinfda tetiklashtiruvchilarni ko'rib chiqamiz, agar kimdir kursor tomonidan ishlatiladigan jadvalni qo'shsak, sizning arizangiz takroran bajarilishini to'xtatadi, chunki SQL serveri tezroq kursorni kamroq joyga o'zgartiradi Tezroq.

Kursorlardan foydalanish

Mahalliy o'zgaruvchidan foydalanish kabi kursorlardan foydalanish - siz ularni e'lon qilasiz, qiymatini belgilaysiz va keyin foydalaning. Biroq, harakatlar maydoni bo'lganida avtomatik ravishda yo'q qilinadigan mahalliy o'zgaruvchilardan farqli o'laroq, kursor tomonidan ishlatiladigan satrni aniq chiqaring va keyin kursorni yo'q qilishingiz kerak.

Kursorlarni yaratish

Kursordan foydalanishning birinchi bosqichi uning yaratilishidir. Trantac-SQL kursorlari kursor operatoridan foydalanib yaratilgan.

Diqqat! SQL serveri ikki xil kursorni yaratishni qo'llab-quvvatlaydi: SQL-92 sintaksisidan foydalangan holda va trantact-sql sintaksisidan foydalanib. SQL-92 sintaksisi Ansi standartiga mos keladi, ammo bu erda ko'rib chiqilgan trantag-SQL sintaksisidan kichik funktsiyalarga ega.

Kursor operatori quyidagi sintaksisga ega:

Kursor nomini e'lon qiling

[ko'rinishi]

[Aylantiring]

[Qulf]

Operator_sets uchun

E'tibor bering, kursorning xususiyatlarini - ko'rinishi, turi va hokazo xususiyatlarini aniqlaydigan barcha parametrlar. - majburiy emas. Ushbu parametrlar uchun standart qiymatlar murakkab va aks etishi mumkin yoki manba yozuvlari yoki qarashlar bilan o'zaro aloqada bo'lish usullari, shuningdek ma'lumotlar bazasi bilan ishlash variantlari bilan o'zaro aloqada bo'lish usullari. Operatorni idrok etish uchun yanada qulayroq bo'lish uchun sizga kerakli barcha parametrlarni aniq belgilash yaxshiroqdir. Shu bilan birga, nimaga erishganingizni aniq bilib olasiz.

Kursorning ko'rinishi mahalliy yoki globalning kalit so'zlaridan foydalanib, @Local_Table yoki @@ global_TTable-ning kalit so'zlari sifatida aniqlanadi.

Kengash. SQL serveri o'z harakat joyini (ko'rinishi) tark etganda mahalliy kursorni yopadi va ozod qiladi, ammo har doim buni aniq bajarishi yaxshiroqdir.

O'tkazish parametrlari sizga faqat boshidan oxirigacha yoki biron bir yo'nalishda yoki biron bir yo'nalishda o'tish imkoniyati ko'rsatilgan holda oldinga yoki o'tish kalit so'zlaridan foydalanishga imkon beradi.

Turli parametr yaratilgan kursor turini belgilaydi. Bu erda statik, tugmacha, dinamik va tezkor so'zlarning kalit so'zlari. Fast_FROWARWAR HUJJAT QISMINI ENG YAXSHI KO'RSATISh Parollar parametr bir-biriga mutlaqdir.

Qulf parametri chiziqlar kursor tomonidan o'zgartirilishi mumkinligini aniqlaydi va agar shunday bo'lsa, boshqa foydalanuvchilarni o'zgartirishlari mumkin. Agar o'qish_only kalit so'z ishlatilsa, kursor manba ma'lumotlariga o'zgartirish kirita olmaydi. Biroq, boshqa foydalanuvchilar ma'lumotlarni o'zgartirishlari mumkin yoki uni yangilash bayonnomasidan foydalanishingiz mumkin. Agar blokirovka qilish parametrlari ko'rsatilgan aylanma_loklar, yangilanishlar faqat kursor tomonidan amalga oshirilishi mumkin. Boshqa barcha foydalanuvchilar tomonidan boshqa barcha yangilanish bayonotlari, boshqa foydalanuvchilar tomonidan taqdim etilmaydi.

Oxirgi blokirovka qilish variant, optimist, shuningdek, kursor ichida va undan tashqarida satrlarni yangilashga imkon beradi. Bu eng moslashuvchan variant, ammo har doim kursorning kursorni o'qiyotganidan keyin satr o'zgartirilgan bo'lsa, kursor tomonidan belgilangan o'zgartirish tugaydi.

Agar kursor turi boshqa turdagi turdagi turdan ko'rsatilgan turdagi turdagi tartibda o'zgartirilsa, tip_warning parametrini mijozga ogohlantiruvchi xabar yuborish uchun belgilanadi. Agar siz ko'rsatilgan tanlangan qismni qo'llab-quvvatlamaydigan kursorni e'lon qilsangiz, bu mumkin.

Umumiy iborada ko'rsatilgan parametr operatori majburiydir. Bu ko'plab kursorlarga kiritiladigan chiziqlarni belgilaydi.

Yangilash uchun ibora majburiy emas. Odatiy holga ko'ra, kursorlar o'qiladi_only parametrlari ko'rsatilmagan bo'lsa, lekin natijada olingan natijaga amin bo'lish uchun ushbu iborani ishlatish yaxshiroqdir. Siz o'zgartirishni tan olgan ba'zi satrlarni belgilash uchun siz ismlar_stolets qismidan foydalanishingiz mumkin. Agar siz ism_lbs qismining qismini tushirsangiz, modifikatsiya Tanlangan bayonotda ko'rsatilgan barcha ustunlar uchun o'zgartirish mumkin.

Kursor o'zgaruvchilar

Transcal-SQL sizga katakchani, masalan, kursor kabi e'lon qilish imkonini beradi. Bunday holda, standart e'lon qilish Sintaksis kursor yaratmaydi; Belgilangan kalit so'z yordamida kursor uchun o'zgaruvchini aniq belgilashingiz kerak.

MyCursor kursorini e'lon qiling.

Moyni moylardan tanlash uchun

@MycristavoreBare kursorini e'lon qiling

@MycristavAröz \u003d mycursor

Agar siz turli kursorlarga berilishi mumkin bo'lgan o'zgaruvchini yaratmoqchi bo'lsangiz, ushbu sintaksis foydalidir. Agar siz turli xil natija to'plamlari bilan ishlash uchun umumlashtirilgan tartibni yaratsangiz, bu zarur bo'lishi mumkin.

Siz kursor o'zgaruvchisini e'lon qilishingiz mumkin, so'ngra uni to'g'ridan-to'g'ri kursorni yaratish uchun foydalaning.

@Mycristerbati Kursorni o'rnating @MycristiorVare \u003d Kursorning mahalliy tezligi uchun moyni moylardan tanlang

Bunday sintaksisdan foydalanganda kursor identifikatorga ega emas va unga amal qilish faqat o'zgaruvchi orqali amalga oshirilishi mumkin.

Kursorni ochish

Kursor deklaratsiyasi kursor ob'ektini yaratadi, ammo kursorni manipulyatsiya qiladigan (kursor) ni yaratadi. Kursorni ochguningizcha ko'plab kursor yaratilmaydi. Kursor operatorini e'lon qilishning etarlicha murakkab sintaksidan so'ng operator sintaksisi juda shaffof ko'rinadi:

Ochiq kursor_ili_uled

Global kalit so'z mojarolarning oldini olishga yordam beradi: agar global kalit so'zi bilan bir xil identifikatorga ega bo'lsa, kursor havolasi, agar siz global ishlatmagan bo'lsangiz, kursor havolasi mahalliy kursorga to'g'ri keladi kalit so'z. Boshqa shunga o'xshash holatlarda, global kursorni ochsangiz, kalit so'zni aniq belgilash yaxshiroqdir.

Kursorni yopish

Kursordan foydalanib, uni yopishingiz kerak. Operator Kursorning ko'pchiligini ushlab turish uchun ishlatiladigan resurslarni bo'shatadi, shuningdek, deklaratura parametridan foydalansangiz, satrlarga ta'sirlangan barcha qulflar. Yopish buyrug'i sintaksisi operator sintaksisini ochish uchun deyarli bir xil hisoblanadi - faqat kalit so'z o'zgaradi:

Kursor_ili_uled

Ozodlik kursori

Kursorni yaratish bilan bog'liq harakatlar ketma-ketligidagi oxirgi operatsiya - bu operator operatoridir. Sintaksis ham oddiy:

Kursor_ili_uled shtamp

Biroq, bitta pastki pastki qism bor: deliyot operatori identifikatorni yoki kursor o'zgaruvchisini olib tashlaydi, ammo bu kursorning o'zi kerak emas. Kursorning o'zi o'chirilmasa, uni eslatib o'tma, yoki unga amal qilishni to'xtatadi (harakat doirasini tark etganda). Quyidagi misollarni ko'rib chiqing:

MyCursor Kursetni yaratish - MyCursor Kursetni yaratish * Yog 'tasnifini yaratish - @cursorvaryuning kursorini yaratish - MyCursvarde \u003d MyCursorning hozirgi o'zgaruvchan kursorini yaratish

Kursor qo'yib yuborilgandan so'ng, MyCursor identifikatori ko'plab kursor bilan bog'liq emas, lekin @CurlarVaruni, kursor va kursor kursorning to'plamiga emas. Agar siz aniq chiqmasa, shuningdek, kursor o'zgaruvchisi, kursor va ko'plab kursorlar o'zgaruvchi kuchini yo'qotmaguncha mavjud bo'ladi.

Kursordan foydalanib manipulyatsiya

Kursorlar o'zlarining yordami bilan muayyan harakatlarni amalga oshira olmasangiz, hech qanday qiziqish uyg'otmaydi. Transcal-SQL Kurschilar bilan ishlash uchun uchta turli xil buyruqni qo'llab-quvvatlaydi: olib, yangilang va o'chiring.

Fetch buyrug'i turli xil kursor torlaridagi belgilangan ipni oladi. Oddiy versiyasida Fetch buyrug'i quyidagi sintaksisga ega:

Fetch Kursor_i_name

Ushbu yozuv formatida satr kursor holatiga qaytariladi (joriy chiziq).

Oddiy fayllar buyrug'idan foydalaning

  1. Ildiz katalogidagi qadam papkasida SQL-ga o'ting, soddalashtirilgan skriptni ta'kidlang va ochish (Ochiq) ni bosing.
  2. So'rovnoma analizatsiyasi so'rov belgisiga skriptni yuklab oladi.

Kengash. Siz ushbu skript tegishli tanlangan bayonotga qaraganda uzunroq qilinganligini payqashingiz mumkin. Gap shundaki, kursorni yaratish va ochish qo'shimcha vaqt talab etiladi. Agar tanlangan bayonot vazifasini bajarish uchun etarli bo'lsa, kursordan foydalanmang.

Fetch buyrug'i nafaqat satrni to'g'ridan-to'g'ri qaytarishi mumkin, balki o'zgaruvchilardagi qaytarilgan ustundan qiymatlarni tejashga imkon beradi. O'zgaruvchan buyruq natijalarini tejash uchun quyidagi sintaksisdan foydalaning:

Kursor_yli_amma-ga olib boring_name

Ro'yxat_Name vergul bilan ajratilgan o'zgaruvchan identifikatorlarning ro'yxati. Fetch buyrug'ini bajarishdan oldin siz o'zgaruvchini e'lon qilishingiz kerak. Ro'yxat_name har bir ustun uchun o'zgaruvchini o'z ichiga olishi kerak, bu esa kursorni belgilaydi. O'zgaruvchining ma'lumotlar turi to'g'ri yoki ustun ma'lumot turiga mos bo'lishi kerak.

Ajratish bilan qatorlarni o'zgaruvchilarga tanlang.

Oldingi barcha misollarda Fetch operatori joriy chiziqni qaytarish uchun ishlatilgan. Fetch operatori sintaksisi, shuningdek, boshqa satrni belgilash uchun bir qator kalit so'zlarni taqdim etadi. Ushbu kalit so'zlardan foydalanganda, FORTCHI Operator belgilangan satrni qaytaradi va uni joriy qiladi.

Ushbu kalit so'zlar sizga ko'p kursorda mutlaq holat qo'yish qobiliyatini beradi. Avval kalit so'zlar birinchi va oxirgi satrlarni mos ravishda qaytaradi, mos ravishda boshidan (agar n musbat) yoki oxirida (agar salbiy) yoki oxirida (agar salbiy bo'lsa) kursor yozuvlari to'plamini o'rnatadi. N qiymati doimiy (3) yoki o'zgaruvchi (@terou) sifatida ifodalanishi mumkin.

Ularning mutlaq pozitsiyasini tanlash.

  1. Fampabsolute nomini qayd eting va ochish (OPEN) ni bosing. So'rovnoma analizatsiyasi so'rov belgisiga skriptni yuklab oladi.

O'zlarining mutlaq pozitsiyasida satrlarni olish qobiliyatini beradigan kalit so'zlardan tashqari, Forpute operatori uchta kalit so'zlarni taqdim etadi, bu esa sizning pozitsiyasini joriy chiziqga nisbatan chiqarib olishga imkon beradi. Keyingi operator quyidagi chiziqni qaytaradi, qolgan operator oldingi chiziqni qaytaradi va amaldagi n operatori oqimdan n iplarda joylashgan satrni qaytaradi. To'ldirilgan nol-alangalangan operatsiyani ushlab turing, agar N-ni salbiy bo'lsa, n-da, agar n ijobiy bo'lsa, joriy sopinglar mavjud.

Qisqa holat bo'yicha qatorlarni tanlang

  1. Skriptni bekor qilish va ochish-ni bosing va oching. So'rovnoma analizatsiyasi so'rov belgisiga skriptni yuklab oladi.

Agar kursor oldinga_only yoki o't o'chirish turiga ega bo'lsa, uni faqat kalit so'zni ko'rsatish uchun faqat kalit so'zni ishlatish mumkin. Aslida, agar kursor ushbu turlardan birini ishlamasa, keyingi kalit so'z kerak emas. SQL serveri har bir olib keladigan bayonot aslida keyingi bayonotdir.

Yuqori tezlikda kursor uchun keyingi bayonotni ishlating

  1. Feth'mentFirehoz nomini belgilang va oching (Open). So'rovnoma analizatsiyasi so'rov belgisiga skriptni yuklab oladi.

Andery analizatsioner asboblar panelidagi so'rov so'rovini bosing. So'rov analizatsioner so'rov o'tkazadi.

Kursorlar orqali satrlarni o'zgartirish va olib tashlash

Agar kursoringiz o'zgaruvchan bo'lsa. Bir nechta kursordagi dastlabki qiymatlarning o'zgarishi shunchaki oddiy. Kursor orqali modifikatsiyani qo'llab-quvvatlaydigan joyning o'ziga xos shakli:

Yangilash jadvali: Kursor_ili_ulome mavjudligi bor listifikatsiyasini yangilang

Bu holatni yangilash deb ataladi. Transkact-SQL shuningdek quyidagi yozuv shaklida quyidagi yozuvlarni olib tashlashni qo'llab-quvvatlaydi:

Delete_ili_Alte Curnu_ieli_terveded mavjud bo'lgan joyda

Pozitsiyani yangilash

  1. Skript nomini aniqlang va Ochiq tugmachani bosing. So'rovnoma analizatsiyasi so'rov belgisiga skriptni yuklab oladi.

Ananar analizatsioner asboblar panelidagi so'rovlar tugmachasini bosing. So'rov analizatsioner so'rov o'tkazadi. E'tibor bering, ikkita panjara ko'rsatilgan. Birinchisi Fetch operatori tomonidan yaratilgan va ustunlarning dastlabki tarkibini o'z ichiga oladi. Ikkinchisi - tanlash qoidalarini ijro etish natijasidir va o'zgartirish maydonini o'zgartirishdan keyin tavsiflash sohasining qiymatini o'z ichiga oladi.

Transcle-SQL kursors monitoringi

Transcle-SQL sizga ishni va kursoringizning holatini kuzatishga yordam beradigan ikkita global o'zgaruvchilar va xususiyatlarni taqdim etadi. @@ Kursor_rows o'zgaruvchisi ulanishda ochilgan ko'plab kursorning ko'p sonidagi qatorlar sonini qaytaradi. Qaytarilgan qiymatlar @@ kursor_rows 1-jadvalda keltirilgan.

O'zgaruvchan @@ Fetch_status oxirgi Fetch buyrug'ining ijrosi to'g'risida ma'lumotni qaytaradi. 2-jadvalda @@ Fetch_status o'zgaruvchisi tomonidan qaytarilgan qiymatlarni ko'rsatadi.

Va nihoyat, tranract-SQL kursor_status funktsiyasini taqdim etadi. Ushbu xususiyat quyidagi sintaksisga ega:

Kursor_status (turi, kursor_ini_uled) turi "mahalliy", "global" yoki "o'zgaruvchi" va kursor_im_name kursorli identifikator yoki kerakli kursor o'zgaruvchisi bo'ladi. Kursor_status funktsiyasi tomonidan qaytarilgan natijalar 3-jadvalda keltirilgan.

Kursorning monitoring xususiyatlaridan foydalaning

  1. Vazifning tugashini belgilang va ochish (Ochiq) ni bosing. So'rovnoma analizatsiyasi so'rov belgisiga skriptni yuklab oladi.

Chop etish versiyasi

Aniq kursor - bu dastur reklama bo'limida aniq belgilangan tanlov buyrug'i. Noto'g'ri kursor e'lon qilganda, unga nom beriladi. Buyruqlarni qo'shish, yangilash, birlashtirish va o'chirish uchun, aniq kursorlar aniqlab bo'lmaydi.

Tanlash buyrug'ini aniq kursor sifatida aniqlash orqali dasturchi Oracle ma'lumotlar bazasidan ma'lumot namunalarining asosiy bosqichlari ustidan nazoratni oladi. Bu kursorni (Fetmce) ochishni (Fetmce) ochishni aniqlaydi, bu esa qatorlarni tanlash va oxirgi buyruq yordamida kursorni qachon yopish kerakligini belgilaydi. Hozirgi kursor holati to'g'risidagi ma'lumotlar uning xususiyatlari orqali mavjud. Bu juda yaxshi nazorat tafsilotlari bo'lib, ular aniq kursorlarni dasturchi uchun bebaho vosita.

Misolni ko'rib chiqing:

1 funktsiyasi Jalousousy_level (do'stlar.name%) Qaytish raqami 3-raqamli Jeykousy_cur 5, Jords 7-ni tanlang (NAME_IN). 8 8 ralkousy_rec Jeyhtusy_cur% RowtyPe; 9 Retval raqami; 10 11 Open Jeysousy_curni boshlang; 13 12 Fetch hasadusy_cur Jeykousy_Rec-ga; 15 13 Agar Jeykusy_cur% Agar Jeykousy_Rec.Socation \u003d "Puerto-Riko" 16 "Puerto-Riko" 16 bo'lsa, retval: \u003d 10; 17 Elliif hasadousy_rec.costy \u003d "chicago" 18 Keyin rethal: \u003d 1; 19 Oxir-oqibat, agar; 20 if bo'lsa, 24 21 Yigit Yaqinlashing_cur; 26 22 Ridvalni qaytaring; 23-istisno 24 Agar 25-boshqalar bo'lsa, agar Janahal_cur% 6 Yaqin hasady_cur; 27 Agar tugash; 28 OFT;

Bir necha soniya bo'limlarda ro'yxatdagi har bir operatsiyalar batafsil ko'rib chiqiladi. "Kursor" atamasi, agar matnda buning aksi aniq ko'rsatilgan bo'lsa, ularda "Kursor" atamasi.

Aniq kursor haqida e'lon

Aniq kursordan foydalanish qobiliyatini qilish uchun uni PL / SQL blokirovka qilish bo'limida yoki paketda e'lon qilish kerak:

Kursor_name [(parametr [parametr [parametr [parametr ...])] [Qaytishni qaytarish_elects] buyruq_select];

Bu erda kursor nomi e'lon qilingan kursorning ismi; SpeedPishcia_t? Bu - ixtiyoriy bo'limi qaytarilishi; KOMHDACESELECT - har qanday ruxsat etilgan SQL-ni tanlang. Kursor parametrlardan o'tishi mumkin (keyingi "Keyingi" Kursor sozlamalariga qarang "). Va nihoyat, tanlangandan keyin ... yangilash buyrug'i uchun siz yangilash uchun ustunlar ro'yxatini o'rnatishingiz mumkin (shuningdek quyida ko'ring). Xabardan so'ng, kursor ochiq buyruq bilan ochiladi va undan olib boriladigan qatorlar Fetch buyrug'i bilan amalga oshiriladi.

Aniq kursorlarning e'lonlariga bir nechta misollar.

  • Parametrlarsiz kursor. Ushbu kursorning natijasi olingan stolning barcha qatorlaridan tanlangan kompaniya identifikatorlari to'plamidir:
Kursor Company_cur kompaniyaning Company_ID-ni tanlash;
  • Parametrlar bilan kursor. Ushbu kursorning natijasi paydo bo'lgan to'plamida uzatilgan parametr qiymatiga mos keladigan kompaniya nomi bilan bitta satrni o'z ichiga oladi:
Kursor nomi_cur (Company_ID_IN ') kompaniyaning_ID_IN-dan ismini tanlang;
  • Qaytish kursori. Ushbu kursorning natijasi olingan to'plamda 10 ta identifikatorli birlik uchun barcha xodimlarning barcha ma'lumotlari mavjud:
Kursor Emp_cur Revie-dan qaytariladi% RowtyPe-ni identifikatsiyadan o'tkazing_id \u003d 10;

Kursor nomi

Aniq kursorning ismi 30 tagacha belgidan iborat bo'lishi kerak va qolgan PLA / SQL identifikatorlari kabi bir xil qoidalarga mos keladi. Kursor nomi o'zgaruvchi emas - bu ko'rsatgichning aniqlagichidir. Kursor nomi qiymatga tayinlanmagan, uni iboralarda qo'llanilishi mumkin emas. Kursor faqat ochiq, yaqin va FECT buyruqlarida qo'llaniladi, shuningdek kursor atributiga aniqlik kiritadi.

Kursor Reklama paketdagi reklama

Kurschilar PL / SQL blokirovka reklamalarida e'lon qilinadi. Kursor paket darajasida e'lon qilinishi mumkin, ammo ma'lum bir protsedura yoki paket funktsiyasida emas. Paketda ikkita kursorning reklamalariga misol:

Box_info Kursor Tits_cur - kitoblardan sarlavhani tanlang; Kursor bayslar_cur (sarlavha_filter_in) Qaytish kitoblari% RowtyPe Sarlavha_filter_in kabi sarlavhasi mavjud bo'lgan kitoblardan * ni tanlang. Oxiri;

Birinchi titul_cur kursori faqat kitob sarlavhasini qaytaradi. Ikkinchidan, kitoblar_cur, kitoblarning nomlari barcha kitoblarning barcha satrlarini qaytaradi, unda kitoblarning nomlari katakcha parametriga mos keladi (masalan, "" PL / SQL "qatorini o'z ichiga olgan barcha kitoblar. Iltimos, diqqat qiling: Ikkinchi kursorda, Qaytish bo'limi Fetch buyrug'i tomonidan qaytarilgan ma'lumotlar tuzilmasini e'lon qiladi.

Qaytish bo'limida quyidagi ma'lumotlar tuzilmalarining har biri ko'rsatilishi mumkin:

  • % RowtyPe atributi yordamida ma'lumotlar jadvali asosida belgilangan yozuvlar.
  • Oldindan e'lon qilingan yana bir xabar asosida belgilangan yozuv% RowtyPe atributidan foydalanmoqda.
  • Dasturchi tomonidan belgilangan yozuv.

Kursor tanlab olish ro'yxatidagi iboralar soni "% RowtyPe, kpketpe yoki yozuv turi" yozuvi yozuvlari soniga to'g'ri keladi. Ma'lumotlar elementlarining turlari ham mos bo'lishi kerak. Masalan, agar namunalar ro'yxatining ikkinchi qismi raqam turi bo'lsa, unda ikkinchi yozish ustuni Qaytish bo'limi yoki Boolean turini kiritib bo'lmaydi.

Qaytish bo'limi va uning afzalliklarini ko'rib chiqishdan oldin keling, avval uni aniqlaylik, nima uchun paketda reklama kursorlari kerak? Nega u ishlatilgan dasturda aniq kursorni e'lon qilmang - protsedura yoki noma'lum blokda?

Javob oddiy va ishonarli. To'plamdagi kursorni aniqlash orqali siz ushbu kodni dasturning turli joylarida takrorlamasdan takrorlashingiz mumkin. So'rovning amalga oshirilishi bir joyda uni takomillashtirish va kodni qo'llab-quvvatlaydi. Bir oz vaqtni tejashni tiklash jarayonlari sonini kamaytirish orqali erishiladi.

Shuningdek, regor kursoriga asoslangan kursor o'zgaruvchisini qaytaradigan funktsiyani yaratish qobiliyatini hisobga olish kerak. Qo'ng'iroqlar dasturi kursor o'zgaruvchisi orqali satrlar namunasini ijro etadi. Qo'shimcha ma'lumot olish uchun "Kursor o'zgaruvchilar va ref kursor" bo'limiga murojaat qiling.

Qayta foydalanish uchun paketlarda kursorlarni e'lon qiladi, bitta muhim holatni hisobga olish kerak. Barcha ma'lumotlar tuzilmalari, shu jumladan "paketlar darajasida" (ma'lum bir funktsiya yoki protsedurada emas), sessiya davomida o'z qadriyatlarini saqlab qoladi. Bu shuni anglatadiki, kattali kursorni aniq yopmaguncha yoki seans tugagunga qadar ochiq qoladi. Ushbu bloklar tugagach, mahalliy bloklarda e'lon qilingan kursorlar avtomatik ravishda yopiladi.

Va endi qaytib keladigan bo'lim bilan shug'ullanamiz. Paketdagi kursorning boshqa reklamalari bitta qiziqarli xususiyat mavjud: kursor sarlavhasini tanadan ajratish mumkin. Bunday sarlavha, funktsiyaning sarlavhasi bilan o'xshashroq, dasturchi ishlash uchun zarur bo'lgan ma'lumotlarni o'z ichiga oladi: kursorning nomi, uning parametrlarining nomi, uning parametrlari va ma'lumotlarning nomi. Kursor tanlash buyrug'i. Ushbu ziyofat kitob_INFO paketidagi "Whats_info" kitobining yangi versiyasida namoyish etiladi:

Box_info Kursors kitoblari_cur (sarlavha_filter_in kitoblar.title% turdagi kitoblar.title% rublpe; Oxiri; Paket tana Kursori - Kursorlar_cur (sarlavha_filter_in) Rivriya kitoblari% RowtyPe sarlavha_filter_in kabi sarlavhasi mavjud bo'lgan kitoblardan * ni tanlang. Oxiri;

Barcha belgilar kalit so'z spetsifikatsiyani shakllantiradi va keyinchalik kursor tanasiga ergashadi. Kursor e'lonlarini ajratish ikkita golga xizmat qilishi mumkin.

  • Ma'lumotni yashirish. Paketdagi kursor - bu "qora qutisi". Dasturchilar uchun qulay, chunki ular tanlash buyrug'ini yozish yoki hatto ko'rishlari shart emas. Qaysi yozuvlar ushbu kursorni qanday tartibda qaytarishini bilish kifoya. To'plam bilan ishlaydigan dasturchi kursorni boshqa har qanday tayyor element sifatida ishlatadi.
  • Minimal qayta ishlash. Agar siz paket tanasida so'rovning ta'rifini yashirsangiz, unda tanlash buyrug'iga kiritilgan o'zgarishlar paketni spetsifikatsiyalashda kursor sarlavhasini o'zgartirmasdan amalga oshirish mumkin. Ushbu paketga qarab dasturlarning yaroqsiz deb belgilanmasdan, kodni aniqlashni va qayta tuzish imkonini beradi, shunda ushbu paketga bog'liq bo'lgan dasturlar yaroqsiz deb belgilangan va ular qayta ishlash uchun kerak bo'lmaydi.

Ochilish kursorini ochish

Kursordan foydalanish uning e'lonlari bo'limidagi ta'rifi bilan boshlanadi. Keyinchalik e'lon qilingan kursorni ochish kerak. Operatorni ochish sintaksisi juda oddiy:

Open_name_name [(argument [, argument ...])]];

Bu erda xost nomi ilgari e'lon qilingan kursorning ismi va argument parametrlar ro'yxati bilan e'lon qilingan bo'lsa, kursor tomonidan uzatilgan qiymat.

Oracle shuningdek, kursorni ochish uchun ishlatiladigan kursorni ochishda sintaksisni qo'llab-quvvatlaydi ("Kursor o'zgaruvchilar va inf strelkalari va infektsionerlari va infektsionerlari" bo'limiga va o'rnatilgan dinamik SQL uchun.

Kursorni ochish, PL / SQL tarkibidagi savolni bajaradi. Bundan tashqari, u faol ma'lumotlar to'plamini aniqlaydi - stollarning mezoniga va Uyushmaning holatiga mos keladigan barcha jadvallar. Ochiq buyruq ma'lumotlarni ajratib qo'ymaydi - bu Fetch buyruq vazifasidir.

Oracle-da amalga oshirilgan birinchi ma'lumotlar namunasi, ma'lumotlar yaxlitligi modeli barcha tanlab olish operatsiyalari barcha tanlab olish operatsiyalari kursorni ochish paytida davlatdagi ma'lumotlarni qaytarilishini ta'minlaydi. Boshqacha qilib aytganda, ochilishdan va kursorni yopishdan oldin, siz undan ma'lumotlarni tanlaganingizda, qo'shimchalar, qo'shimchalar va o'chirilgan o'chirishlar to'liq e'tiborsiz qoldiriladi.

Bundan tashqari, agar tanlash buyrug'i yangilanish bo'limida bo'lsa, barcha kursor ochilganda satr bloklanganligini aniqlaydi.

Ochiq kursorni ochishga harakat qilganingizda PL / SQL quyidagi xato xabarini beradi:

ORA-06511: PL / SQL: Kursor allaqachon ochiq

Shuning uchun, kursorni ochishdan oldin uning holatini atribut qiymati bo'yicha tekshiring. % Izopen:

Agar yo'q bo'lsa, agar yo'q_cur% izopen, keyin ochiq kompaniya_cur; Tugashi bilan tugaydi;

Aniq kursorlarning atributlari quyida keltirilgan, ularga bag'ishlangan bo'limda tasvirlangan.

Agar dastur kursordan foydalanib tsiklda amalga oshirilsa, bu kursor aniq ochilishga muhtoj emas (ma'lumotlar namunasi, yopilishi). PL / SQL yeyrtel uni avtomatik ravishda bajaradi.

Aniq kursordan ma'lumotlarni tanlash

Tanlash buyrug'i virtual jadval yaratadi - Sannatda joylashgan ustunlar bilan belgilangan joy bilan belgilangan joylar to'plami. Shunday qilib, kursor ushbu jadvalni PL / SQL dasturida taqdim etadi. PL / SQL dasturlarida kursorning asosiy maqsadi qayta ishlash uchun satrlar namunasidir. Kursor torli namunasi Fetch buyrug'i bilan amalga oshiriladi:

Ichkariga kiring_name_name_name__amed_uled;

Bu erda kursor nomi bu yozuvni tanlagan va o'zgaruvchilarning ro'yxati, shuningdek, faol rekord to'plamining keyingi chizig'i nusxa ko'chirilgan PL / SQL ma'lumotlar tuzilmalari. Ma'lumotlar PL / SQL-ga joylashtirilishi mumkin (% belgilar yoki o'zgaruvchilar bilan) yoki o'zgaruvchilar bilan (o'zgaruvchilar bilan belgilanadi), masalan, Oracle shakllarida.

Aniq kursorlarga misollar

Quyidagi misollar ma'lumotlarni tanlashning turli usullarini namoyish etadi.

  • Kursordan ma'lumotlarni PL / SQL yozib olish uchun tanlash:
Kursor kompaniyasini e'lon qilish_cur-ni tanlang ... ;; Kompaniya_REC kompaniyasi_cur% RowtyPe; Open_cur Open_curni boshlang; Company_cur kompaniyasi_REC-ga kirish;
  • O'zgaruvchiga kursordan ma'lumotlarni tanlash:
New_ballece_cur-ni yangi_Balance_dolllar ichiga oling;
  • Kursordan ma'lumotlarni PL / SQL jadval satriga, o'zgaruvchan va o'zgaruvchan Oracle shakllariga tanlash:
Fetch Emp_name_cur AmP_name (1), joustate: @min_samay;

Kursordan tanlangan ma'lumotlar har doim "% RowtyPe" atributlari bilan bir xil kursorga asoslangan yozuvga joylashtirilishi kerak; O'zgaruvchan ro'yxatlarda namuna olishdan saqlaning. Yozuvdagi tanlov kodni ko'proq ixcham va moslashuvchan qiladi, fayllar buyrug'ini o'zgartirmasdan namunaviy ro'yxatni o'zgartirishga imkon beradi.

Oxirgi qatorni qayta ishlashdan keyin tanlab olish

Kursorni ochish, siz undan charchamaguningizcha, undan satrni tanlaysiz. Biroq, va keyin siz Fetch buyrug'ini bajarishingiz mumkin.

G'alati etarli, bu holda PL / SQL istisnoni boshlamaydi. U shunchaki hech narsa qilmaydi. Sizda boshqa biron bir narsani tanlash uchun hech narsa yo'qligi sababli, karta bo'limlarida o'zgaruvchilarning qiymatlari o'zgarmaydi. Boshqacha qilib aytganda, Fetch buyrug'i bu o'zgaruvchilarning qadriyatlarini NULL ga tenglashtirmaydi.

Aniq kursor ustunlarining taxalluslari

Kursor deklaratsiyasida tanlash buyrug'i ularga qaytarilgan ustunlar ro'yxatini aniqlaydi. Jadvallarning ustunlarining nomlari bilan bir qatorda, ushbu ro'yxatda hisoblangan yoki virtual ustunlar bo'lishi mumkin.

Alias \u200b\u200bustuni ustun yoki ifoda uchun tanlash buyrug'ida ko'rsatilgan alternativ ism. SQL * plyusdagi mos keladigan taxalluslarni belgilab, siz o'zboshimchalik bo'yicha so'rov natijalarini o'qiydigan shaklda namoyish etishingiz mumkin. Bunday vaziyatlarda taxalluslar majburiy emas. Boshqa tomondan, aniq taxalluslar kursorlaridan foydalanganda, quyidagi hollarda hisoblangan ustunlar kerak:

  • kursordan ma'lumotlarni bir xil kursorga qarab% RowtyPe atributi bilan e'lon qilingan kirish uchun ma'lumotlarni tanlashda;
  • dasturda hisoblangan ustunga havolani mavjud bo'lsa.

Quyidagi so'rovni ko'rib chiqing. Tanlash buyrug'i 2001 yil davomida tovarlarni buyurtma qilgan barcha kompaniyalarning ismlarini, shuningdek buyurtmalarning umumiy miqdorini tanlaydi (joriy standart ma'lumotlar bazasi indeksi uchun DD-Mon-Yyyy formatlash niqobidan foydalanadi):

Companiya kompaniyasining C.com va I.Invoice_Date kompaniyasidan Co.com va I.Invoice_Date-ni tanlang, menda "01-yanvar-2001" va "31-dekabr 2001".

Ushbu buyruqni SQL * plyusda bajarishda quyidagi natija olasiz:

Kopmaniya nomi. Sum (infer_amt)
ACME Turbo Inc. 1000
Vashington Sochli Co. 25.20

Ko'rib turganingizdek, summa ustuni sarlavhasi hisobot uchun juda mos keladi, ammo oddiy ma'lumotlarni ko'rish uchun juda mos keladi. Endi aniq kursor yordamida PL / SQL dasturida xuddi shu so'rovni bajaring va ustunli taxallus qo'shing:

Kursor kompakturasi C.Name (Inst_amt) to'liq deb e'lon qiladi, men C.com va I.Invoice_Date-ni "01-yanvar-2001" va "31-dekabr 2001" jamoasidan tanlang; Kompont_rec kompozit_cur% RowtyPe; Ochiq komponturani boshlang; Kompozitsiya kompozitsiyasi; Oxiri;

Taxallussiz, men ustunni komplektr yozma tuzilmasidagi ustunga murojaat qilolmayman. Agar hisoblangan ustunning taxallusi bo'lsa, siz boshqa shartlar ustuni bilan xuddi shunday ishlashingiz mumkin:

Agar CRE_REC.TOTAL_ASALES\u003e 5000 Keyin Dbms_outputiputDuppd_line ("Siz kredit limitingizdan 5000 dollar miqdorida" | "Siz 5000 dollardan oshib ketdingiz - 5000," 99999 "); Tugashi bilan tugaydi;

Hisoblangan ustun bilan yozuvni ekish paytida, hisoblangan ustunga kirish faqat nom bilan olish mumkin - bu yozuv tuzilishi kursor tuzilishi bilan belgilanishi mumkin.

Aniq kursorni yopish

Bolalikda bir marta bizni o'zlari uchun o'rgatishdi va bu odat biz bilan hayot uchun qolib ketdi. Ma'lum bo'lishicha, ushbu qoida dasturlashda juda muhim rol o'ynaydi va ayniqsa kursorlarni boshqarishda davom etayotganda. U endi kerak bo'lmasa, kursorni yopishni hech qachon unutmang!

Buyruq sintaksisini yopish:

End_name_name;

Quyida aniq kursorlarning yopilishi bilan bog'liq bir nechta muhim maslahatlar va mulohazalar mavjud.

  • Agar kursor e'lon qilinsa va protsedurada ochiq bo'lsa, uni tugatgandan so'ng uni yopishni unutmang; Aks holda, xotira oqimi sizning kodingizda bo'ladi. Nazariy jihatdan, kursor (har qanday ma'lumotlar tuzilishi singari) harakat joyini tark etishda avtomatik ravishda yopilishi va yo'q qilinishi kerak. Qoida tariqasida, protseduradan voz kechish paytida PLA / SQL BLE / SQL-ni haqiqatan ham ochib beradi. Ammo bu jarayon resurslarning ma'lum xarajatlari bilan bog'liq, shuning uchun PLA / SQL samaradorligi sabablari uchun ba'zida identifikatsiya qilish va ochiq kursorlarning yopilishini kechiktiradi. Ref kursorlari kabi kursorlar aniq tarzda yopib bo'lmaydi. Siz "Tashqi" PL / SQL-ga qaytarilsa, "PL / SQL" SQL yoki boshqa qo'ng'iroq qiluvchilar uchun "PL / SQL" ning navbati bilan "PL / SQL" ning ochiqchasiga ishonch hosil qilishingiz mumkin bo'lgan yagona narsa. , Ref kursoridan tashqari. Oracle texnologiya tarmog'idan "PL / SQL statik SQL-dagi kursorni qayta ishlatish" maqolasi PL / SQL kursorlarni qanday yopadi. Noma'lum anonim bloklar - pl / sql kursorlarning yashirin yopilishini amalga oshirmaydigan vaziyatning namunasi. Ushbu mavzu bo'yicha qiziqarli ma'lumotlar Jonathan Gennikning "PLA / SQL-larni aniq yopadimi?" Deb maqolasida keltirilganmi? "
  • Agar kursor paket paketida e'lon qilingan bo'lsa va ba'zi blok yoki dasturda ochiq bo'lsa, uni yopmaguningizcha yoki seans tugagunga qadar ochiladi. Shuning uchun, partiya darajasini berish bo'yicha ishni tugatib, u darhol yaqin buyruqqa yaqin bo'lishi kerak (va yo'lga, istisnoda ham xuddi shunday qilish kerak):
My_packgege.my_cursorni ochishni boshlang; ... biz kursor bilan ishlaymiz My_PackAckge.my_cursor; Agar boshqalar bo'lsa, boshqalar Agar myPackge.my_cursor% izopen bo'lsa, my_packgege.my_cursorni yoping; Tugashi bilan tugaydi; Oxiri;
  • Kursor ilgari ochilgan bo'lsa, faqat yopilishi mumkin; Aks holda, haqiqiy emas_curs0r-istisno amalga oshiriladi. Kursor shtati% estropen atributi yordamida tekshiriladi:
Agar kompaniya_cur% izopen bo'lsa, keyin Company_cur; Tugashi bilan tugaydi;
  • Agar dasturda ochiq kursorlar juda ko'p bo'lsa, ularning soni Open_Cursors ma'lumotlar bazasi parametrining qiymatidan oshishi mumkin. Xato xabarini olgandan so'ng, birinchi navbatda, kursorlar paketlarda e'lon qilinganidan keyin yopiq ekanligiga ishonch hosil qiling.

Kursorlar fazilatlari

Oracle to'rtta atributni qo'llab-quvvatlaydi (% topilgan,%,% estopen,% Ro Rolcunmm) aniq kursorning holati to'g'risida ma'lumot olish uchun. Atributatga havola quyidagi sintaksisga ega:% atribut

Bu erda kursor e'lon qilingan kursorning ismi.

Kursorlar atributlari tomonidan qaytarilgan qadriyatlar jadvalda keltirilgan. biri.

1-jadval. Kursorlar fazilatlari

Ular bilan turli xil operatsiyalarni amalga oshirishdan oldin kursor atributlarining qiymatlari jadvalda ko'rsatilgan. 2.

Kursorlar atributlari bilan ishlash, quyidagilarni ko'rib chiqish kerak:

  • Kursorni ochishdan oldin,% topilmasligingiz yoki% ziddiyatli atletikaga murojaat qilganingizda, Oracle noto'g'ri kursor (ORA-01001) istisnodir.
  • Agar olingan satrning birinchi ijroidan so'ng, olib keladigan satrlar bo'sh bo'ladi, kursor atributlari quyidagi qiymatlarni qaytaradi:% Topildi \u003d% iNatfaun \u003d Haqiqiy va% Routcunt \u003d 0.
  • Ommaviy to'plamlardan foydalanganda% Rowcation atributi belgilangan to'plamlarda ekilgan qatorlar sonini qaytaradi.

2-jadval. Kursorlarning atributi

Operatsiya % Topildi % Topilmadi % Izopen. % Rowccount.
Ochish. Istisno
Ora-01001
Istisno
Ora-01001
Yolg'on Istisno
Ora-01001
Ochiqdan keyin Nol Nol To'g'ri. 0
Birinchi namunaning paydo bo'lishi oldidan Nol Nol To'g'ri. 0
Birinchi namunadan keyin
Tanbeh
To'g'ri. Yolg'on To'g'ri. 1
Keyingi safardan oldin
Tanbeh
To'g'ri. Yolg'on To'g'ri. 1
Keyingi pethdan keyin To'g'ri. Yolg'on To'g'ri. Ma'lumotlarga bog'liq
Oxirgi namunaning oldidan To'g'ri. Yolg'on To'g'ri. Ma'lumotlarga bog'liq
Oxirgi namunaning oshganidan keyin To'g'ri. Yolg'on To'g'ri. Ma'lumotlarga bog'liq
Yopishdan oldin Yolg'on To'g'ri. To'g'ri. Ma'lumotlarga bog'liq
Yopishdan keyin Istisno Istisno Yolg'on Istisno

Ushbu sifatlardan foydalanish quyidagi misolda namoyish etiladi:

Avvalroq bloglarda, protseduralar va funktsiyalarning parametrlaridan foydalanish mumkin bo'lgan misollar bir necha bor etkazilgan. Parametrlar - bu ma'lumot moduliga va undan ma'lumotni uzatish vositasi. To'g'ri foydalanish bilan ular modullarni ko'proq foydali va moslashuvchan qiladi.

PL / SQL sizning kursorlarning parametrlarini o'tkazishga imkon beradi. Ular dastur modullarining parametrlari, shuningdek bir nechta qo'shimcha funktsiyalarni bajaradilar.

  • Kursorlardan bir nechta foydalanishni kengaytirish. Qaerda bo'lmasin, qaerda joylashgan bo'lsa, unda ma'lumotlarni tanlashning o'rniga, ma'lumotni tanlash shartlarini belgilashda kursorning har bir ochilishida ushbu taklifga yangi qiymatlarni uzatish uchun ishlatilishi mumkin.
  • Kurslar ko'lami bilan bog'liq muammolarni hal qilish. Agar qat'iy kodlangan qiymatlarning o'rniga parametrlar so'rovda ishlatiladi, natijada kursor qatorlari dastur yoki blokning ma'lum bir o'zgaruvchisiga bog'lanmagan. Agar dasturda chop etilayotgan bloklar bo'lsa, kursor yuqori darajada aniqlanishi va uni parametrlar bilan ishlatilishi mumkin.

Kursor parametrlari soni cheklanmagan. Ochilganda, kursor uchun barcha parametrlarning qiymatlarini belgilash kerak (standart qiymatlar aniqlanadigan parametrlardan tashqari).

Kurschilar qaysi holatlarda parametrlarni talab qiladi? Umumiy qoida tartib va \u200b\u200bfunktsiyalar uchun bir xil: agar u turli joylarda va kursor turli joylarda ishlatiladi va turli xil qiymatlar bilan u uchun parametr aniqlanishi kerak deb taxmin qilinsa. Keling, kursorlarni parametr bilan vasiz taqqoslaylik. Parametrlarsiz kursorning misoli:

Kursor Jook_cur - bu ism, kategoriya, oxirgi_ed_date-ni hazillardan tanlang;

Natijada keltirilgan kursor to'plamini hazil jadvalining barcha yozuvlarini o'z ichiga oladi. Agar bizga faqat satrlarning bir qismi kerak bo'lsa, bo'limning qayerda sotuvga kiritilgan bo'lsa:

Kursor Jook_cur - ism, kategoriya, kategoriya \u003d "eri";

Ushbu vazifani bajarish uchun biz parametrlardan foydalanmadik, ammo ularga kerak emas. Bunday holda, kursor tarkibidagi barcha qatorlarni ma'lum bir kategoriya bilan qaytaradi. Ammo qanday bo'lish kerak, agar ushbu yadroga murojaat qilsangiz, kategoriyadagi o'zgarishlar?

Parametrlar bilan kursorlar

Albatta, biz har bir kategoriya uchun alohida kursorni aniqlamaymiz - bu ma'lumotlar bilan boshqariladigan dasturlarni ishlab chiqishda mutlaqo nomuvofiqdir. Bizga faqat bitta kursor kerak, ammo bunday kategorni o'zgartirish mumkin edi va u hali ham kerakli ma'lumotlarni qaytaradi. Va eng yaxshisi (faqat bitta emas) bu vazifani hal qilish parametrorni aniqlashdir:

Protsedura izohlay_joke (main_ctegory_in) dae_ctegory_id% turida) Kursorni tashkil etuvchi parametrlar ro'yxatiga ega || Faqat satrli parametrdan. * / Kursor Jook_cur (Varra2-dagi toifa_in) - bu toifaga (toifadagi (toifadagi) joylashtirilgan Nom, toifadagi /use_Date-ni tanlang; Jook_Rec Jook_cur% RowtyPe; Kursorni ochganda / * endi argument * / ochilishi jook_cur (Main_ctegory_in) yuboriladi; JOSES_CUR JOOS_REC-ga qarang;

Kursor nomi va kalit so'zda parametrlar ro'yxati mavjud. Qaerda bo'lmasin, qaerga almashtirilgan bo'lsa, qattiq kodlangan erning qiymati yuqorida (toifa_in) ga tegishli. Kursorni ochganda, siz er, er yoki erning qiymatini belgilashingiz mumkin - kursor hali ham ishlaydi. Kursor hazil stoli qatorlarini qaytarishi kerak bo'lgan sahifaning nomi (qavs ichida) tom ma'noda, konstansiya yoki iboralar sifatida o'rnatiladi. Kursorni ochish paytida, tanlash buyrug'i tahlil qilish va parametr qiymati bilan bog'liq. Keyin olingan satrlar belgilanadi - va kursor namunaga tayyor.

Parametrlar bilan kursorni ochish

Yangi kursorni har qanday toifadan ochish mumkin:

Ochlik_cur (Jokes_pkg.ctegory); Ochiq hazil_cur ("eri"); Ochiq hazil_cur ("siyosatchi"); Ochiq Joke_cur (Jokes_pkg.rifi || - - Qonun »);

Kursor parametrlari ko'pincha bu holatda ko'pincha ishlatiladi, ammo siz boshqa joylarda siz ularga murojaat qilishingiz mumkin:

Kursor Jook_cur (Arrar2-dagi kategor_in) ni e'lon qiling, toifadagi \u003d yuqori (toifadagi) joylashgan.

Jadvaldan toifani o'qish o'rniga, biz namunalar ro'yxatiga toifa parametrini almashtiramiz. Natijada bir xil bo'lib qoladi, chunki bu holat parametr qiymatining namunaviy toifasini cheklaydi.

Kursor parametrlari maydoni

Kursor parametrining doirasi ushbu kursor bilan cheklangan. Kursor parametri kursor bilan bog'liq tanlash buyrug'i deb atash mumkin emas. PL / SQL parchalari STAD_NAME identifikatori blokdagi mahalliy o'zgaruvchini emasligi sababli tuzilmaydi. Bu faqat kursor ichida aniqlangan rasmiy kursor parametri:

Kursorni sezgirlik /cur (dastur_name VARCHRAR2) ni tanlang (Scary_level VARCHRARE) Sum (Scar_level), Tales_FROM_Trypte \u003d Dastur_name; Dastur_name-ni boshlash: \u003d "Nafas olish mumiyasi"; / * Yaroqsiz havola * / ochiq sirlilik_cur (dastur_name); .... Kinokine_cur yoping; Oxiri;

Kursor parametr rejimlari

Kursor parametrlarining sintaksisi protseduralar va funktsiyalar sintaksisiga juda o'xshashdir - kursorlar faqat parametrlar bo'lishi mumkin. Kurslar uchun siz tashqarida yoki rejimda rejimini ko'rsatolmaysiz. Ushbu rejlar sizga qiymatlarni uzatish va qaytarishga imkon beradi, bu kursor uchun ma'nosi yo'q. Kursordan ma'lumot olishning faqat bitta usuli bor: ustunlar ro'yxatidan yozuvlar va nusxalarni olishni tanlash

Odatiy parametr qiymatlari

Kursor parametrlari standart qiymatlar bilan belgilanishi mumkin. Kursorning asl parametr qiymati bilan:

Kursor Emp_cur (EmP_ID_IN raqami: \u003d 0) Xodimdan Xodimdan, ish beruvchidan, ish beruvchidan, men / EmP_ID_IN;

Standart qiymat Emp_ID_IN parametrini belgilab qo'yganligi sababli, siz Fetch buyrug'ida uning qiymatini ko'rsata olmaysiz. Bunday holda, kursor 0 kod bilan xodim haqida ma'lumotni qaytaradi.