Ms sql kursoridan olib tashlash. MySQL saqlangan protseduralaridagi kursorlar. A. Oddiy kursor va sintaksisdan foydalanish

Kursorning ta'rifi berilgan. Uning turlari va xatti-harakatlarining tavsifi berilgan: statik, dinamik, ketma-ket va kalit kursorlar. Kursorni boshqarish tamoyillari tavsiflangan: kursorni yaratish va ochish, ma'lumotlarni o'qish, kursorni yopish. Kursor dasturlash misollari keltirilgan.

Kursor tushunchasi

Relyatsion ma'lumotlar bazasiga qarshi so'rov odatda ma'lumotlarning bir nechta qatorlarini (yozuvlarini) qaytaradi, lekin dastur bir vaqtning o'zida faqat bitta yozuvni qayta ishlaydi. Agar u bir vaqtning o'zida bir nechta satrlar bilan shug'ullansa ham (masalan, ma'lumotlarni elektron jadvallar ko'rinishida ko'rsatish), ularning soni hali ham cheklangan. Bundan tashqari, ma'lumotlarni o'zgartirish, o'chirish yoki qo'shishda ish birligi seriya hisoblanadi. Bunday vaziyatda kursor tushunchasi birinchi o'ringa chiqadi va bu kontekstda kursor qatorga ko'rsatgichdir.

SQL-dagi kursor - bu ma'lumotlar bazasi xotirasidagi so'nggi SQL bayonotini saqlash uchun mo'ljallangan maydon. Agar joriy bayonot ma'lumotlar bazasi so'rovi bo'lsa, joriy qiymat yoki joriy kursor chizig'i deb ataladigan so'rov ma'lumotlari qatori ham xotirada saqlanadi. Xotirada ko'rsatilgan maydon nomlanadi va amaliy dasturlar uchun ochiqdir.

Odatda, kursorlar ma'lumotlar bazasidan unda saqlangan ma'lumotlarning bir qismini tanlash uchun ishlatiladi. Istalgan vaqtda bitta kursor chizig'i dastur tomonidan tekshirilishi mumkin. Kursorlar ko'pincha protsessual tillarda yozilgan amaliy dasturlarga kiritilgan SQL operatorlarida qo'llaniladi. Ulardan ba'zilari ma'lumotlar bazasi serveri tomonidan bilvosita yaratilgan, boshqalari esa dasturchilar tomonidan belgilanadi.

SQL standartiga muvofiq, kursorlar bilan ishlashda quyidagi asosiy amallarni ajratib ko'rsatish mumkin:

  • yaratish yoki kursor deklaratsiyasi;
  • ochiladigan kursor, ya'ni. uni ko'p darajali xotirada saqlanadigan ma'lumotlar bilan to'ldirish;
  • kursordan tanlash va u bilan ma'lumotlar qatorlarini o'zgartirish;
  • kursorni yopish, shundan so'ng u foydalanuvchi dasturlari uchun mavjud bo'lmaydi;
  • kursorni bo'shatish, ya'ni. kursorni ob'ekt sifatida o'chirish, chunki uni yopish u bilan bog'liq xotirani bo'shatish shart emas.

Kursorning ta'rifi amalda biroz farq qilishi mumkin. Misol uchun, ba'zida ishlab chiquvchi kursor uchun ajratilgan xotirani aniq bo'shatishi kerak. Keyin kursorni qo'yib yuboring uning bog'langan xotirasi ham bo'shatiladi. Bu uning ismini qayta ishlatish imkonini beradi. Boshqa ilovalarda qachon kursorni yopish xotirani bo'shatish bilvosita sodir bo'ladi. Qayta tiklashdan so'ng darhol boshqa operatsiyalar uchun foydalanish mumkin bo'ladi: boshqa kursorni ochish va hokazo.

Ba'zi hollarda kursordan foydalanish muqarrar. Biroq, iloji bo'lsa, buning oldini olish va standart ma'lumotlarni qayta ishlash buyruqlari bilan ishlash kerak: SELECT, UPDATE, INSERT, DELETE. Kursorlar ma'lumotlarning butun hajmini o'zgartirish operatsiyalariga ruxsat bermasligiga qo'shimcha ravishda, kursor yordamida ma'lumotlarni qayta ishlash operatsiyalarini bajarish tezligi sezilarli darajada past. standart vositalar SQL.

MS SQL Server muhitida kursorlarni amalga oshirish

SQL Server uch turdagi kursorlarni qo'llab-quvvatlaydi:

  • SQL kursorlari asosan triggerlar, saqlangan protseduralar va skriptlar ichida qo'llaniladi;
  • server kursorlari serverda ishlaydi va ODBC, OLE DB, DB_Library uchun amaliy dasturlash interfeysini amalga oshiradi;
  • Mijoz kursorlari mijozning o'zida amalga oshiriladi. Ular serverdan butun natija qatorlarini oladi va uni mahalliy sifatida saqlaydi, bu esa tarmoq operatsiyalariga sarflangan vaqtni kamaytirish orqali ma'lumotlarni qayta ishlashni tezlashtiradi.

Ko'p foydalanuvchili ilovalarning har xil turlari ma'lumotlarga parallel ravishda kirishning har xil turlarini talab qiladi. Ba'zi ilovalar ma'lumotlar bazasidagi o'zgarishlar haqidagi ma'lumotlarga darhol kirishni talab qiladi. Bu chiptalarni bron qilish tizimlari uchun odatiy holdir. Boshqa hollarda, masalan, statistik hisobot tizimlarida, ma'lumotlarning barqarorligi muhim ahamiyatga ega, chunki u doimiy ravishda o'zgartirilsa, dasturlar ma'lumotlarni samarali ko'rsata olmaydi. Turli xil ilovalar kursorlarning turli xil ilovalarini talab qiladi.

SQL Serverda kursor turlari taqdim etayotgan imkoniyatlariga qarab farqlanadi. Kursor turi uni yaratish bosqichida aniqlanadi va uni o'zgartirib bo'lmaydi. Kursorlarning ba'zi turlari boshqa foydalanuvchilar tomonidan natijalar to'plamiga kiritilgan qatorlarga kiritilgan o'zgarishlarni aniqlay oladi. Biroq, SQL Server faqat qatorga kirish vaqtida bunday qatorlardagi o'zgarishlarni kuzatib boradi va satr allaqachon o'qilganidan keyin o'zgarishlarni o'zgartirishga ruxsat bermaydi.

Kursorlar ikki toifaga bo'linadi: ketma-ket va aylantirilishi mumkin. Ketma-ket faqat bitta yo'nalishda - boshidan oxirigacha ma'lumotlarni tanlash imkonini beradi. Qaytib olinadigan kursorlar kattaroq harakat erkinligini ta'minlash - ikki yo'nalishda harakat qilish va kursor natijalari to'plamining ixtiyoriy qatoriga o'tish mumkin.Agar dastur kursor ko'rsatgan ma'lumotlarni o'zgartirishga qodir bo'lsa, u aylantiriladigan va o'zgartiriladigan deb ataladi. Kursorlar haqida gapirganda, biz tranzaksiya izolyatsiyasi haqida unutmasligimiz kerak. Bir foydalanuvchi yozuvni o'zgartirganda, boshqasi uni o'z kursoridan foydalanib o'qiydi va bundan tashqari, u xuddi shu yozuvni o'zgartirishi mumkin, bu esa ma'lumotlar yaxlitligini saqlashni talab qiladi.

SQL Server statik, dinamik, ketma-ket va kalitlar to'plami tomonidan boshqariladi.

Bilan sxemada statik kursor ma'lumotlar ma'lumotlar bazasidan bir marta o'qiladi va oniy tasvir sifatida saqlanadi (bir vaqtning o'zida), shuning uchun boshqa foydalanuvchi tomonidan ma'lumotlar bazasiga kiritilgan o'zgarishlar ko'rinmaydi. Qisqa muddatga kursorni ochish server o'zining to'liq natijalar to'plamiga kiritilgan barcha qatorlarga qulf o'rnatadi. Statik kursor yaratilgandan keyin o'zgarmaydi va har doim ochilish vaqtida mavjud bo'lgan ma'lumotlar to'plamini ko'rsatadi.

Agar boshqa foydalanuvchilar manba jadvalidagi kursorga kiritilgan ma'lumotlarni o'zgartirsa, bu ta'sir qilmaydi statik kursor.

IN statik kursor O'zgartirishlar kiritish mumkin emas, shuning uchun u har doim faqat o'qish rejimida ochiladi.

Dinamik kursor ma'lumotlarni "jonli" holatda saqlaydi, lekin bu tarmoq va dasturiy resurslarni talab qiladi. Foydalanish dinamik kursorlar manba ma'lumotlarining to'liq nusxasi yaratilmaydi, lekin foydalanuvchi ma'lum ma'lumotlarga kirgandagina manba jadvallaridan dinamik tanlash amalga oshiriladi. Qabul qilish vaqtida server qatorlarni bloklaydi va foydalanuvchi kursorning to'liq natijalar to'plamiga qilgan har qanday o'zgarishlar kursorda ko'rinadi. Biroq, kursor ma'lumotlarni olgandan keyin boshqa foydalanuvchi o'zgarishlar kiritgan bo'lsa, ular kursorda aks etmaydi.

Kursor tugmalar to'plami bilan boshqariladi, bu ekstremallar orasida o'rtada joylashgan. Yozuvlar namuna olish vaqtida aniqlanadi va shu bilan o'zgarishlar kuzatiladi. Ushbu turdagi kursor orqaga aylantirishni amalga oshirishda foydalidir - keyin ma'lumot yangilanmaguncha va drayver tanlamaguncha qatorlarni qo'shish va o'chirish ko'rinmaydi. yangi versiya yozuvlar, agar ularga o'zgartirishlar kiritilgan bo'lsa.

Ketma-ket kursorlar teskari yo'nalishda ma'lumotlarni olishga ruxsat berilmaydi. Foydalanuvchi faqat kursorning boshidan oxirigacha qatorlarni tanlashi mumkin. Seriya kursor barcha qatorlar to'plamini saqlamaydi. Ular kursorda tanlangan zahoti ma'lumotlar bazasidan o'qiladi, bu esa foydalanuvchilar tomonidan ma'lumotlar bazasiga kiritilgan barcha o'zgarishlarni INSERT, UPDATE, DELETE buyruqlari yordamida dinamik ravishda aks ettirish imkonini beradi. Kursor ma'lumotlarning eng so'nggi holatini ko'rsatadi.

Statik kursorlar ma'lumotlarning barqaror ko'rinishini ta'minlash. Ular axborot "saqlash" tizimlari uchun yaxshi: hisobot tizimlari uchun ilovalar yoki statistik va tahliliy maqsadlar uchun. Bundan tashqari, statik kursor katta hajmdagi ma'lumotlarni tanlash bilan boshqalarga qaraganda yaxshiroq ishlaydi. Aksincha, elektron xarid qilish yoki chiptalarni bron qilish tizimlari o'zgarishlar kiritilganda yangilangan ma'lumotlarni dinamik idrok etishni talab qiladi. Bunday hollarda u ishlatiladi dinamik kursor. Ushbu ilovalarda uzatiladigan ma'lumotlar miqdori odatda kichik bo'lib, ular qator (individual yozuv) darajasida foydalaniladi. Guruhga kirish juda kam uchraydi.

MS SQL Server muhitida kursorlarni boshqarish

Kursorni boshqarish quyidagi buyruqlarni bajarish orqali amalga oshiriladi:

  • DECLARE - yaratish yoki kursor deklaratsiyasi;
  • OCHIQ - ochiladigan kursor, ya'ni. uni ma'lumotlar bilan to'ldirish;
  • OLISH kursordan tanlash va kursor yordamida ma'lumotlar qatorlarini o'zgartirish;
  • YAPISH - kursorni yopish;
  • BERISH - kursorni bo'shatish, ya'ni. kursorni ob'ekt sifatida o'chirish.

Kursor deklaratsiyasi

SQL standarti kursor yaratish uchun quyidagi buyruqni beradi:

INSENSITIVE kalit so'zidan foydalanish yaratiladi statik kursor. Ma'lumotlar o'zgarishi ruxsat berilmaydi, bundan tashqari, boshqa foydalanuvchilar tomonidan kiritilgan o'zgarishlar ko'rsatilmaydi. Agar INSENSITIVE kalit so'zi yo'q bo'lsa, a dinamik kursor.

SCROLL kalit so'zini ko'rsatganingizda, yaratilgan kursorni istalgan yo'nalishda aylantirish mumkin, bu sizga har qanday tanlash buyruqlaridan foydalanish imkonini beradi. Agar bu argument o'tkazib yuborilsa, kursor bo'ladi izchil, ya'ni. uni ko'rish faqat bitta yo'nalishda - boshidan oxirigacha mumkin bo'ladi.

SELECT iborasi SELECT so'rovining asosiy qismini belgilaydi, natijada kursor uchun qatorlar to'plamini belgilaydi.

FOR READ_ONLY ni belgilash faqat o'qish uchun kursorni yaratadi va ma'lumotlarga hech qanday o'zgartirish kiritishga ruxsat bermaydi. U statikdan farq qiladi, garchi ikkinchisi ham ma'lumotlarni o'zgartirishga ruxsat bermaydi. Faqat o'qish uchun kursor sifatida e'lon qilinishi mumkin dinamik kursor, bu boshqa foydalanuvchi tomonidan kiritilgan o'zgarishlarni ko'rsatishga imkon beradi.

FOR UPDATE argumenti bilan kursor yaratish kursorda bajarish imkonini beradi ma'lumotlar o'zgarishi ko'rsatilgan ustunlarda yoki OF ustun_nomi argumenti bo'lmasa, barcha ustunlarda.

MS SQL Server muhitida kursor yaratish buyrug'i uchun quyidagi sintaksis qabul qilinadi:

<создание_курсора>::= SELECT_statement UCHUN kursor_nomi KURSORni E'lon qiling ]]

LOCAL kalit so'zidan foydalanish faqat paket, trigger, saqlangan protsedura yoki dastur doirasida ko'rinadigan mahalliy kursorni yaratadi. moslashtirilgan funksiya. Paket, trigger, protsedura yoki funksiya tugagach, kursor bilvosita yo'q qilinadi. Kursor tarkibini uni yaratgan konstruksiyadan tashqariga o'tkazish uchun uning parametriga OUTPUT argumentini belgilash kerak.

Agar GLOBAL kalit so'zi ko'rsatilgan bo'lsa, global kursor yaratiladi; u joriy ulanish yopilguncha mavjud.

FORWARD_ONLY belgilanishi yaratiladi ketma-ket kursor; Ma'lumotlardan faqat birinchi qatordan oxirgi qatorgacha bo'lgan yo'nalishda namuna olish mumkin.

SCROLL ni belgilash yaratiladi aylantiriladigan kursor; Ma'lumotlarga istalgan tartibda va istalgan yo'nalishda kirish mumkin.

STATIC yaratishni belgilash statik kursor.

KEYSET-ni belgilash kalit kursorini yaratadi.

DYNAMIC yaratishni belgilash dinamik kursor.

READ_ONLY kursor uchun FAST_FORWARD argumentini belgilasangiz, yaratilgan kursor quyidagi uchun optimallashtiriladi. tez kirish ma'lumotlarga. Bu argumentni FORWARD_ONLY yoki OPTIMISTIC argumentlari bilan birgalikda ishlatib bo‘lmaydi.

OPTIMISTIC argumenti bilan yaratilgan kursor keyin o'zgartirilgan qatorlarni o'zgartirish yoki o'chirishni oldini oladi. kursorni ochish.

TYPE_WARNING argumentini belgilash orqali server, agar u SELECT so'roviga mos kelmasa, foydalanuvchini kursor turiga yashirin o'zgartirish haqida xabar beradi.

Kursorni ochish

Uchun kursorni ochish va uni kursorni yaratishda ko'rsatilgan SELECT so'rovi ma'lumotlari bilan to'ldirish uchun quyidagi buyruqdan foydalaning:

Keyin kursorni ochish Bog'langan SELECT operatori bajariladi, uning chiqishi ko'p darajali xotirada saqlanadi.

Kursordan ma'lumotlarni olish

Keyin darhol kursorni ochish uning tarkibini (tegishli so'rovni bajarish natijasi) quyidagi buyruq yordamida tanlashingiz mumkin:

FIRST ni belgilash kursorning to'liq natijalar to'plamining birinchi qatorini qaytaradi, bu joriy qatorga aylanadi.

LASTni belgilash kursorning eng oxirgi qatorini qaytaradi. Shuningdek, u joriy qatorga aylanadi.

NEXT ni belgilash to'liq natijalar to'plamidagi joriy satrdan keyingi qatorni darhol qaytaradi. Endi u dolzarb bo'lib qoladi. Odatiy bo'lib, FETCH buyrug'i qatorlarni olish uchun ushbu usuldan foydalanadi.

PRIOR kalit so'zi joriydan oldingi qatorni qaytaradi. U joriy bo'ladi.

Dalil ABSOLUTE (satr_raqami | @satr_raqami_oʻzgaruvchisi) kursorning toʻliq natijalar toʻplamidagi mutlaq tartib raqami boʻyicha qatorni qaytaradi. Satr raqami doimiy yordamida yoki satr raqami saqlanadigan o'zgaruvchining nomi sifatida ko'rsatilishi mumkin. O'zgaruvchi butun sonli ma'lumotlar turi bo'lishi kerak. Ham ijobiy, ham salbiy qiymatlar ko'rsatilgan. Ijobiy qiymatni belgilashda satr to'plam boshidan hisoblanadi, salbiy qiymat esa oxiridan boshlab hisoblanadi. Tanlangan qator joriy qatorga aylanadi. Agar null qiymat belgilansa, hech qanday qator qaytarilmaydi.

Dalil RELATIVE (satrlar soni | @variable qatorlar soni) joriy satrdan keyin belgilangan qatorlar soni bo'lgan qatorni qaytaradi. Agar siz manfiy qatorlar sonini belgilasangiz, joriy satrdan oldin belgilangan qatorlar soni qaytariladi. Null qiymatni belgilash joriy qatorni qaytaradi. Qaytarilgan qator joriy qatorga aylanadi.

Kimga global kursorni oching, uning nomidan oldin GLOBAL kalit so'zini ko'rsatishingiz kerak. Kursor nomini o'zgaruvchi yordamida ham belgilash mumkin.

Dizaynda INTO @variable_name [,...n] qaytarilgan qatorning tegishli ustun qiymatlari saqlanadigan o'zgaruvchilar ro'yxati ko'rsatilgan. O'zgaruvchilarni ko'rsatish tartibi kursordagi ustunlar tartibiga, o'zgaruvchining ma'lumotlar turi esa kursor ustunidagi ma'lumotlar turiga mos kelishi kerak. Agar INTO konstruktsiyasi ko'rsatilmagan bo'lsa, u holda FETCH buyrug'ining harakati SELECT buyrug'ining xatti-harakatiga o'xshaydi - ma'lumotlar ekranda ko'rsatiladi.

Ma'lumotlarni o'zgartirish va o'chirish

Kursor yordamida o'zgartirishlar kiritish uchun siz quyidagi formatda UPDATE buyrug'ini berishingiz kerak:

Joriy kursor satrining bir nechta ustunlari bitta operatsiyada o'zgartirilishi mumkin, ammo ularning barchasi bitta jadvalga tegishli bo'lishi kerak.

Kursor yordamida ma'lumotlarni o'chirish uchun quyidagi formatda DELETE buyrug'idan foydalaning:

Natijada, kursordagi oqim to'plami o'chiriladi.

Kursorni yopish

Yopilgandan so'ng, kursor dastur foydalanuvchilari uchun mavjud bo'lmaydi. Yopish paytida uning ishlashi paytida o'rnatilgan barcha qulflar olib tashlanadi. Yopish faqat ochiq kursorlarga qo'llanilishi mumkin. Yopiq, lekin yo'q erkin kursor qayta ochilishi mumkin. Ochilmagan kursorni yopishga ruxsat berilmaydi.

Kursorni qo'yib yuboring

Kursorni yopish u bilan bog'liq xotirani bo'shatish shart emas. Ba'zi ilovalar DEALLOCATE bayonoti yordamida uni aniq taqsimlashi kerak. Keyin kursorni qo'yib yuboring Xotira ham bo'shatiladi, bu kursor nomini qayta ishlatish imkonini beradi.

Kursorning oxiriga yetganligini nazorat qilish uchun funktsiyadan foydalanish tavsiya etiladi: @@FETCH_STATUS

@@FETCH_STATUS funksiyasi quyidagilarni qaytaradi:

0 agar olish muvaffaqiyatli bo'lsa;

1 kursordan tashqaridagi qatorni olishga urinish tufayli olib kelish muvaffaqiyatsiz tugasa;

2, agar o'chirilgan yoki o'zgartirilgan qatorga kirishga urinish tufayli olish muvaffaqiyatsiz bo'lsa.

DECLARE @id_kl INT, @firm VARCHAR(50), @fam VARCHAR(50), @message VARCHAR(80), @nam VARCHAR(50), @d DATETIME, @p INT, @s INT SET @s=0 PRINT "Xaridlar ro'yxati" klient_kursorni TANLASH UCHUN MAHALLIY E'lon qiling Mijoz Kodi, Kompaniya, Familiya Mijozdan QAYERDA BUYURTDI Shahar="Moskva" Kompaniya BUYURTDI, Familiya Ochiq klient_kursor KEYINGI klient_kursordan @id_kl, @firm, @ATST_ OLISH. =0 BEGIN SELECT @message="Mijoz "+@fam+ "Kompaniya"+ @firm PRINT @message SELECT @message="Mahsulot nomi Sotib olish sanasi Narxi" PRINT @xabar TANLASH UCHUN KURSOR tovar_kursor Mahsulot nomi, tranzaksiya. sanasi, mahsulot .Narx* Tranzaksiya. Miqdori mahsulotdan olingan narx ICHKI QO'SHILGAN tranzaksiya. Mahsulot kodi=Tranzaktsiya.Mahsulot kodi QAYERDA Transaction.Customer Code=@id_kl OCHISH tovar_cursor KEYINGI tovar_cursorDAN OLISH @nam, @d, @p AGAR @@FETCH_STATUS<>0 PRINT "Xaridlar yo'q" HAQIDA @@FETCH_STATUS=0 BOSHLASH TANILA @message=" "+@nam+" "+ CAST(@d AS CHAR(12))+" "+ CAST(@p AS CHAR(6)) CHAPAT @message SET @s=@s+@p tovar_cursorDAN KEYINGIGA KETISH @nam, @d, @p END tovar_cursor YOQISH tovar_cursor SELECT @message="Jami xarajat "+ CAST(@s CHAR(6) AS) PRINT @message -- keyingi mijozga o'tish-- klient_kursordan @id_kl, @firm, @fam INTO KEYINGI KELISH TUG'IRISH klient_kursorni YOQING. 13.6-misol. Moskvadan mijozlar tomonidan sotib olingan tovarlar ro'yxati va ularning umumiy narxini ko'rsatish uchun kursor.

13.7-misol. Moskvadan kelgan mijozlar uchun aylantiriladigan kursorni ishlab chiqing. Agar telefon raqami 1 bilan boshlangan bo'lsa, ushbu raqam bilan mijozni o'chiring va birinchi kursor yozuvida telefon raqamidagi birinchi raqamni 4 bilan almashtiring.

DECLARE @firm VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @message VARCHAR(80) PRINT "Mijozlar ro'yxati" E'lon qiling klient_kursor KURSOR GLOBAL SROLL Klaviatura to'plamini TANLASH Firma, Familiya, Telefon F. QAYERDA Siti ="Moskva" kompaniyasi BUYURTDI, Familiyasi YANGILANISH UCHUN klient_kursorni Oching klient_kursordan KEYINGI @firm, @fam, @telga olib keling. @firm " Phone "+ @tel PRINT @message -- agar telefon raqami 1 dan boshlansa, -- shu raqamga ega mijozni o'chiring AGAR @tel '1%' YOQSA Klientni o'chiring mijoz_kursor BOSHQA QERDA -- keyingisiga o'ting mijoz KEYINGI klient_kursordan @firm, @fam, @telga olib keling. MUTLAK 1 tani klient_kursordan @firm, @fam, @tel ga olib keling -- birinchi yozuvda telefon raqamidagi birinchi raqamni 4 ta yangilangan Client SET telefoniga almashtiring. ='4' + RIGHT(@ tel,LEN(@tel)-1)) QERDA klient_kursorni TANGLASH @message="Mijoz "+@fam+" Firma "+ @firm "Telefon"+ @tel PRINT @xabar YAPISh mijoz_kursor klient_kursorni BO'LASH 13.7-misol. Moskvadan kelgan mijozlar uchun aylantiriladigan kursor.

13.8-misol. Foydalanish kursor protseduraning chiqish parametri sifatida. Jarayon ma'lumotlar to'plamini qaytaradi - mahsulotlar ro'yxati.

Chiqish kursoridan protsedurani chaqirish va ma'lumotlarni chop etish quyidagicha amalga oshiriladi:

DECLARE @my_cur KURSOR DECLARE @n VARCHAR(20) EXEC my_proc @cur=@my_cur EXEC EXEC my_proc @cur=@my_cur OUTPUT FETCH FROM FROM INTO INTO @n SELECT @n HAQIDA (@@FETCH_STATUS=0) BEST BERING FETCH FROM FROM IN TO @n_cur YAPISH @my_cur BOSHQARISh @my_cur


Kursor kontekstli xotira maydoniga havoladir. SQL dasturlash tilining ba'zi ilovalarida (Oracle, Microsoft SQL Server) - so'rovni bajarishda olingan natijalar to'plami va tegishli joriy yozuv ko'rsatkichi. Men kursor shunday deb aytardim virtual jadval bu muqobil ma'lumotlar ombori. Bunday holda, kursor uning ma'lumotlariga xuddi oddiy massivning ma'lumotlari kabi kirish imkonini beradi.
Kursorlar saqlanadigan protseduralarda qo'llaniladi. Etarli nazariya, keling, misolni ko'rib chiqaylik:
Bizda ma'lumotlar bazasi bor (ma'lumotlar bazasi biroz yaxshi emas, bu mening laboratoriya ishi, lekin bizning ma'lumotlar bazasi o'qituvchimiz bunday tuzilmani talab qildi)
/*bank ma'lumotlari*/
JADVAL `bank` YARATING (

`BankName` VARCHAR (50) COLLATE utf8_bin NO NULL DEFAULT "" ,


ASOSIY KALT (`BankId`)

)ENGINE=InnoDB
CHARAKTERLAR TO'PLAMI "utf8" UYUMLASH "utf8_bin" ;
/*depozitlar to'g'risidagi ma'lumotlar */
“Bank taqsimoti” JADVAL YARATISH (
`BankId` INTEGER (11) NO NULL ,
`Persent` INTEGER (11) DEFAULT NULL ,
`Hissot miqdori` DECIMAL (10,0) NULL EMAS,
`ClientId` INTEGER (11) NO NULL ,
ASOSIY KALT(`BankId`, `ClientId`),
KEY "BankId" ("BankId"),
KEY "ClientId" ("ClientId"),
CHEKLASH `bankdistribution_fk` EXT KALİT (`BankId`) MA'LUMOTLAR `bank` (`BankId`),
CHEKLASH `bankdistribution_fk1` EXT KALİT (`ClientId`) MA'LUMOTLAR `mijoz` (`ClientId`)
)ENGINE=InnoDB
/*investorlar haqida ma’lumotlar*/
JADVAL `mijoz` yaratish (
`ClientId` INTEGER (3) NULL EMAS AUTO_INCREMENT,
`CreditCardId` BIGINT(10) NULL EMAS,
`Familiya` VARCHAR (50) COLLATE utf8_bin NO NULL DEFAULT "" ,
`Nomi` VARCHAR (50) COLLATE utf8_bin NO NULL DEFAULT "" ,
`FirstName` VARCHAR (50) COLLATE utf8_bin NO NULL DEFAULT "" ,
`Telefon` VARCHAR (50) COLLATE utf8_bin NO NULL DEFAULT "" ,
`Manzil` VARCHAR (50) COLLATE utf8_bin NO NULL DEFAULT "" ,
`SafeId` INTEGER (5) NULL EMAS,
ASOSIY KALT(`ClientId`, `CreditCardId`),
KEY "ClientId" ("ClientId")

)ENGINE=InnoDB
AUTO_INCREMENT=11 BELGILAR TO'PLADI "utf8" UTF8_bin

Aytaylik, biz har bir bankni navbatma-navbat qabul qilishimiz va u bilan ba'zi harakatlarni bajarishimiz kerak, bunda bizga quyidagi so'rov yordam berishi mumkin.

“Bank”ni tanlang.* BIZGA KERAK BO'LGAN_RECORD_CHEKLAMASI 'bank' dan,1
. Shunday qilib, LIMIT WE NEED_RECORD NUMBER, 1-dan foydalanib, biz bank jadvalidan tsikldagi har bir yozuvni chiqaramiz va u bilan kerakli amallarni bajaramiz, shu bilan birga WE NEED_RECORD NUMBER qiymatini 1 ga oshiramiz. Endi biz ham xuddi shunday qilamiz, lekin kursor
Boshlanishi
/* biz maʼlumotlarni ajratib oladigan oʻzgaruvchilar */
vBankId butun sonini e'lon qilish;
vBankName deklaratsiyasi VARCHAR(50);
vAddress e'lon qilish VARCHAR(50);
vPhone VARCHARni e'lon qilish (50);
/* hadler o'zgaruvchisi - a*/
Bajarilgan butun sonni standart 0 deb e'lon qilish;
/*Kursor deklaratsiyasi*/
`bank`.`BankId`,`bank`.`BankName`,`bank`.`Manzil`,`bank`.`Telefon`, FROM `bank` uchun BankKursor kursorini e`lon qiling, bu erda 1;
/*HANDLER maqsadi, bu quyida tushuntiriladi*/
SQLSTATE "02000" SET UCHUN ISHLAB CHIQISHNI DAVOM ETISHNI E'lon qilish bajarildi=1;
/* kursorni ochish */
Bank kursorini ochish;
/*ma’lumotlarni olish*/
Bajarilgan vaqtda = 0 DO

biz kerakli harakatlarni qilamiz
END WHILE ;
/*kursorni yopish*/
Bank kursorini yopish;
OXIRI ;

* Ushbu manba kodi Source Code Highlighter bilan ta'kidlangan.

Xato: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

Xabar: Maʼlumot yoʻq – nol qatorlar olindi, tanlandi yoki qayta ishlandi

SQLSTATE: 02000 kursor oxiriga yetganda yoki tanlash yoki yangilash bo'sh qatorni qaytarganda yonadi.

Keyingi qatorda biz kursorni e'lon qildik E'lon qilish kursor_nomi CURSOR FOR select_statement;
Kursorni oching Kursor_nomini ochish;
Keyin, kursorning oxiriga yetguncha (WHILE done = 0 DO), biz ma'lumotlarni ajratib olamiz va uni qayta ishlaymiz.
Saqlangan protseduradan chiqishdan oldin kursorni yopishingiz kerak. kursor_nomini yopish;

Bu murakkab ko'rinmaydi. Ammo SQLSTATE "02000" bilan bog'liq ko'plab tuzoqlar mavjud.

Bajarilgan vaqtda = 0 DO
BankKursorni vBankId, vBankName, vAddress, vPhone GA OLISH;

BankId = vBankId chegarasi 1 bo'lgan bank taqsimotidan vContributeAmountSUM INTO (ContributeAmount) ni tanlang;
ba'zi harakatlar qilamiz
END WHILE ;

* Ushbu manba kodi Source Code Highlighter bilan ta'kidlangan.


Sintaksis nuqtai nazaridan hamma narsa yaxshi va to'g'ri. Ammo mantiqiy nuqtai nazardan, yo'q. Omonatchilar ba'zi banklarda hisob ochmagan bo'lishi mumkin, keyin BankId = vBankId chegarasi 1 bo'lgan bank taqsimotidan vContributeAmountSUM INTO (ContributeAmount) ni tanlang; SQLSTATE: 02000 yonadi, bajarilgan o'zgaruvchi 1 ga o'rnatiladi va while tsikli biz kutganimizdan erta tugaydi. Quyidagi amallarni bajarish orqali buning oldini olish mumkin
Bajarilgan vaqtda = 0 DO
BankKursorni vBankId, vBankName, vAddress, vPhone GA OLISH;
/* har qanday omonat summasini bank uchun ko'chirib olish */


agar (vContributeAmountSUM > 0) bo'lsa
/* har qanday omonat summasini bank uchun ko'chirib olish */

agar tugaydi;
ba'zi harakatlar qilamiz
END WHILE ;

* Ushbu manba kodi Source Code Highlighter bilan ta'kidlangan.


Birinchi so'rov bilan biz hissalar mavjudligini tekshirdik (agar ular bo'lmasa, vContributeAmountSUM == 0) va agar mavjud bo'lsa, biz ma'lumotlarni olamiz.

Keling, har bir mijoz uchun turli banklardagi hisoblardagi umumiy summani olib tashlashimiz kerak, deylik
ClientSummCursor kursorini e'lon qilish summani tanlang

Tanlangan summa (`bankdistribution`.`ContributeAmount`), `bankdistribution`.`ClientId` FROM `bankdistribution` Ichki qo`shilish mijozi (client.ClientId = bankdistribution.`ClientId`) uchun ClientSummCursor kursorini e`lon qiling, bunda `bankdistribution` bo`yicha 1 guruh. 'ClientId';

ClientSummCursor-ni oching;
Bajarilgan vaqtda = 0 DO
BankKursorni vBankId, vBankName, vAddress, vPhone GA OLISH;
/* har qanday omonat summasini bank uchun ko'chirib olish */
BankId = vBankId chegarasi 1 bo'lgan bank taqsimotidan vContributeAmountSUM INTO Count(ContributeAmount) ni tanlang;
/* haqiqatan ham ushbu bankda omonat borligini tekshiring */
agar (vContributeAmountSUM > 0) bo'lsa
/* har qanday omonat summasini bank uchun ko'chirib olish */
BankId = vBankId chegarasi 1 bo‘lgan bank taqsimotidan vContributeAmountSUM INTO ContributeAmount ni tanlang;
agar tugaydi;


ba'zi harakatlar qilamiz.
END WHILE ;

* Ushbu manba kodi Source Code Highlighter bilan ta'kidlangan.

Xuddi shu holat ClientSummCursor kursoridagi ma'lumotlar BankCursordagi ma'lumotlardan erta tugashi, SQLSTATE: 02000 ishga tushirilganda, bajarilgan o'zgaruvchi 1 ga o'rnatilganda va while tsikli biz kutganimizdan erta tugashi mumkin. Quyidagi amallarni bajarish orqali buning oldini olish mumkin

ClientSummCursor-ni oching;
Bajarilgan vaqtda = 0 DO
BankKursorni vBankId, vBankName, vAddress, vPhone GA OLISH;
/* har qanday omonat summasini bank uchun ko'chirib olish */
BankId = vBankId chegarasi 1 bo'lgan bank taqsimotidan vContributeAmountSUM INTO Count(ContributeAmount) ni tanlang;
/* haqiqatan ham ushbu bankda omonat borligini tekshiring */
agar (vContributeAmountSUM > 0) bo'lsa
/* har qanday omonat summasini bank uchun ko'chirib olish */
BankId = vBankId chegarasi 1 bo‘lgan bank taqsimotidan vContributeAmountSUM INTO ContributeAmount ni tanlang;
agar tugaydi;
/* ikkinchi kursordan ma’lumotlarni olishdan oldin sqlstate holatini eslab qoling */
SET old_status = bajarildi;
/* bizga kerak bo'lgan ma'lumotlarni chiqarib oling */
ClientSummCursorni vSum, vClientId INTO KELISH;
/* ma'lumotlar olingan yoki yo'qligini tekshiring va sqlstate 0200 muvaffaqiyatsiz tugadi */
agar (bajarilgan = 0) bo'lsa
ba'zi harakatlar qilamiz.
agar tugaydi;
/* vaqt tugashidan oldin bajarilgan o'zgaruvchining qiymatini tiklang */
belgilangan bajarildi = old_status;
END WHILE ;

* Ushbu manba kodi Source Code Highlighter bilan ta'kidlangan.

Hozirgacha o'qigan barchaga rahmat, bu kimgadir foydali bo'ladi deb umid qilaman.

U QUYIDAGI MUQADDALAR: SQL Server (2008 yildan) Baza SQL ma'lumotlari Azure SQL ma'lumotlar ombori Parallel ma'lumotlar ombori

Transact-SQL server kursorining atributlarini belgilaydi, masalan, ko'rish xususiyatlari va kursor ishlaydigan natijalar to'plamini yaratish uchun ishlatiladigan so'rov. DECLARE CURSOR bayonoti Transact-SQL til kengaytmalari to'plamidan foydalanadigan ISO standart sintaksisini ham, sintaksisini ham qo'llab-quvvatlaydi.

ISO sintaksisi kursor_nomini E'lon qilish [ SEZOR ] [ AYLANTIRISH ] KURSORNI tanlash_iborasi [ UCHUN ( FAQAT O'QISh | YANGILANISH [ Ustun_nomi [ ,...n ] ] ) ] [;] Transact-SQL kengaytirilgan sintaksisi Kursor_nomini E'lon qilish KURSOR [ MAHALLIY | GLOBAL ] [ FORWARD_ONLY | SROLL ] [ STATIC | Klaviatura toʻplami | DINAMIK | FAST_FORWARD ] [ FAQAT_FAQAT READ_ | SCROLL_LOCKS | OPTIMIST ] [ TYPE_OGOHLANTIRISH ] tanlash_iborasi uchun [ YANGILANISH UCHUN [ Ustun_nomi [ ,...n ] ] ] [;]

kursor_nomi
kursor_nomi

SESSIZ
tempdb; Shunday qilib, asosiy jadvallardagi o'zgarishlar ushbu kursorning tanlovlari tomonidan qaytarilgan ma'lumotlarda aks ettirilmaydi va bu kursor o'zgarmaydi. ISO sintaksisidan foydalanilganda, SEZOR opsiyasi belgilanmagan bo'lsa, asosiy jadvallarga kiritilgan yangilanishlar va o'chirishlar keyingi tanlovlarda ko'rinadi.

SROLL
Namuna olishning barcha variantlari mavjudligini bildiradi (BIRINCHI, OXIRGI, OLDINGI, KEYINGI, NISBIY, MUTLAK). Agar ISO DECLARE CURSOR iborasida SCROLL opsiyasi belgilanmagan bo'lsa, faqat NEXT olish opsiyasi qo'llab-quvvatlanadi. SCROLL parametrini FAST_FORWARD opsiyasi bilan belgilab bo‘lmaydi.

select_statement
Standart SELECT bayonoti, bu kursorning natijalar to'plamini belgilaydi. Kalit so'zlar FOR BROWSE va INTO ga kirishga ruxsat berilmaydi select_statement kursor deklaratsiyasi.

select_statement so'ralgan turdagi kursor bilan ziddiyat.

FAQAT O'QISH

Yangilash]
ustun_nomi [, .. .n] belgilangan, faqat sanab o'tilgan ustunlar o'zgartirishga ruxsat beradi. Agar UPDATE bayonoti ustunlar ro'yxatisiz ishlatilsa, barcha ustunlar uchun yangilanish mumkin.

kursor_nomi
Muayyan server kursorining Transact-SQL nomi. kursor_nomi identifikatorlar qoidalariga rioya qilishlari kerak.

MAXALIY
Kursor u yaratilgan paket, saqlangan protsedura yoki trigger uchun mahalliy ekanligini bildiradi. Kursor nomi faqat shu sohada amal qiladi. Kursorga mahalliy paket o'zgaruvchilari, saqlangan protseduralar, triggerlar yoki saqlangan protseduraning chiqish parametri orqali murojaat qilish mumkin. OUTPUT parametri mahalliy kursorni chaqiruvchi paketga, saqlangan protseduraga yoki triggerga o'tkazish uchun ishlatiladi, bu esa saqlangan protsedura tugagandan so'ng kursorga keyingi kirish uchun parametrni kursor o'zgaruvchisiga belgilashi mumkin. Kursor, agar kursor OUTPUT parametriga o'tkazilmagan bo'lsa, paket, saqlangan protsedura yoki trigger bajarilishini tugatgandan so'ng, bilvosita chiqariladi. Agar kursor OUTPUT parametriga o'tkazilgan bo'lsa, kursor unga havola qiluvchi barcha o'zgaruvchilar bo'shatilganda yoki doiradan chiqqanda chiqariladi.

GLOBAL
Kursor ulanish uchun global ekanligini bildiradi. Kursor nomi ulanishda ishlaydigan har qanday saqlangan protsedura yoki paket tomonidan ishlatilishi mumkin. Kursor faqat ulanish buzilgan taqdirdagina qo'yib yuboriladi.

FORWARD_FAQAT
Kursorni faqat birinchi qatordan oxirigacha ko'rish mumkinligini bildiradi. Faqat FETCH NEXT opsiyasi qo'llab-quvvatlanadi. Agar FORWARD_ONLY STATIC, KEYSET yoki DYNAMIC kalit so'zlarisiz belgilansa, kursor DYNAMIC kursor sifatida ishlaydi. Agar na FORWARD_ONLY argumenti, na SCROLL argumenti ko'rsatilmagan bo'lsa, STATIC, KEYSET yoki DYNAMIC kalit so'zlari mavjud bo'lmasa, standart FORWARD_ONLY argumentidir. STATIC, KEYSET va DYNAMIC kursorlarida SCROLL standart qiymati mavjud. ODBC va ADO kabi ma'lumotlar bazasi API-laridan farqli o'laroq, FORWARD_ONLY rejimi quyidagi Transact-SQL kursorlari tomonidan qo'llab-quvvatlanadi: STATIC, KEYSET va DYNAMIC.

STATIK
Kursor tomonidan foydalanish uchun ma'lumotlarning vaqtinchalik nusxasini yaratadigan kursorni belgilaydi. Kursorga berilgan barcha so'rovlar ko'rsatilgan vaqtinchalik jadvalga kiradi tempdb; Shunday qilib, asosiy jadvallardagi o'zgarishlar ushbu kursorning tanlovlari tomonidan qaytarilgan ma'lumotlarda aks ettirilmaydi va bu kursor o'zgarmaydi.

Klaviatura toʻplami
Kursor ochilganda qatorlar a'zoligi yoki tartibi o'zgarmasligini bildiradi. Qatorlarni noyob tarzda aniqlaydigan kalitlar to'plami jadvalga kiritilgan tempdb chaqirdi kalitlari.

Kursor egasi tomonidan kiritilgan yoki boshqa foydalanuvchilar tomonidan amalga oshirilgan asosiy jadvallardagi asosiy bo'lmagan qiymatlarga o'zgartirishlar kursor egasi uni ko'rganda ko'rsatiladi. Boshqa foydalanuvchilar tomonidan kiritilgan o'zgarishlar aks ettirilmaydi (o'zgartirishlarni Transact-SQL server kursoridan foydalanib bo'lmaydi). Agar satr o'chirilsa, qatorlarni olishga urinish @@FETCH_STATUS -2 ni qaytaradi. Kursor chegaralari tufayli asosiy qiymatlarni yangilash eski qatorni o'chirish va keyin uni kiritishga o'xshaydi. yangi qator. Yangi qiymatlari bo'lgan qator ko'rinmaydi va eski qiymatlari bilan qatorni olishga urinish @@FETCH_STATUS -2 ni qaytaradi. Yangilanishlar, agar ular WHERE CURRENT OF bandidan foydalanib, kursor orqali amalga oshirilsa, darhol ko'rinadi.

DINAMIK
Kursorni ko'rish paytida natijalar to'plamidagi qatorlarga kiritilgan barcha ma'lumotlar o'zgarishlarini ko'rsatadigan kursorni belgilaydi. Har bir tanlovda maʼlumotlar qiymatlari, tartib va ​​qator aʼzoligi farq qilishi mumkin. ABSOLUTE tanlash opsiyasi dinamik kursorlar tomonidan qo'llab-quvvatlanmaydi.

TEZDA OLDINGA
Unumdorlikni optimallashtirish yoqilgan FORWARD_ONLY, READ_ONLY kursorini bildiradi. FAST_FORWARD parametrini SCROLL yoki FOR_UPDATE parametrlari bilan belgilab bo‘lmaydi.

FAQAT O'QISH
Ushbu kursor orqali kiritilgan o'zgarishlarni oldini oladi. WHERE CURRENT OF bandi UPDATE yoki DELETE bayonotidagi kursorga murojaat qila olmaydi. Ushbu parametr standart kursorni yangilash xususiyatidan ustun turadi.

SCROLL_LOCKS
Kursor yordamida o'rnatilgan yangilanishlar yoki o'chirishlar muvaffaqiyatli bo'lishi kafolatlanganligini ko'rsatadi. SQL Server kursorda o'qilgan qatorlarni bloklaydi, bu qatorlar keyingi o'zgarishlar uchun mavjud bo'lishini ta'minlaydi. SCROLL_LOCKS parametrini FAST_FORWARD yoki STATIC parametrlari bilan belgilab bo‘lmaydi.

OPTIMIST
Kursorda o'qilgandan so'ng satr yangilangan bo'lsa, o'rnatilgan yangilanishlar yoki kursor yordamida amalga oshirilgan o'chirishlar muvaffaqiyatsiz bo'lishini bildiradi. SQL Server kursorda o'qilgan qatorlarni bloklamaydi. Buning o'rniga taqqoslashlar qo'llaniladi vaqt tamg'asi ustun qiymatlari yoki jadvalda bo'lmasa nazorat summalari vaqt tamg'asi satr kursorga o'qilganidan keyin o'zgarganligini aniqlash uchun ustun. Agar qator o'zgartirilgan bo'lsa, yangilanish yoki o'chirishga urinishlar muvaffaqiyatsiz bo'ladi. OPTIMIST opsiyasini FAST_FORWARD opsiyasi bilan belgilab bo‘lmaydi.

TYPE_WARNING
Kursor bilvosita so'ralgan turdan boshqasiga aylantirilsa, mijozga ogohlantirish yuborilishini bildiradi.

select_statement
Kursorning natijalar to'plamini belgilaydigan standart SELECT iborasi. COMPUTE, COMPUTE BY, FOR BROWSE va INTO kalit so‘zlariga ruxsat berilmagan. select_statement kursor deklaratsiyasi.

SQL Server, agar bandlar bo'lsa, kursorni bilvosita boshqa turga o'zgartiradi select_statement so'ralgan turdagi kursor bilan ziddiyat. Qo'shimcha ma'lumot olish uchun kursorni yashirin konvertatsiya qilish bo'limiga qarang.

YANGILANISH UCHUN]
Kursorda yangilanadigan ustunlarni belgilaydi. Agar OF ustun_nomi [, ... n] berilgan, faqat sanab o'tilgan ustunlar o'zgartirishga ruxsat beradi. Agar UPDATE bayonoti ustunlar roʻyxatisiz ishlatilsa, READ_ONLY parallellik opsiyasi belgilanmagan boʻlsa, barcha ustunlar uchun yangilash mumkin.

DECLARE CURSOR operatori Transact-SQL server kursorining atributlarini belgilaydi, masalan, ko'rish xususiyatlari va kursor ishlaydigan natijalar to'plamini yaratish uchun ishlatiladigan so'rov. OPEN operatori natijalar to'plamini to'ldiradi va FETCH operatori undan qatorni qaytaradi. CLOSE bayonoti kursor bilan bog'langan joriy natijalar to'plamini tozalaydi. DEALLOCATE bayonoti kursor tomonidan foydalaniladigan resurslarni chiqaradi.

DECLARE CURSOR bayonotining birinchi shakli kursor parametrlarini belgilash uchun ISO sintaksisidan foydalanadi. DECLARE CURSOR bayonotining ikkinchi shakli Transact-SQL tiliga kengaytmalardan foydalanadi, ular kursorlarni ODBC va ADO kabi maʼlumotlar bazasi APIʼlarining kursor funksiyalarida qoʻllaniladigan turlardan foydalangan holda aniqlash imkonini beradi.

Bu ikki shaklni aralashtirib bo'lmaydi. Agar siz CURSOR kalit so'zidan oldin SCROLL ni belgilasangiz yoki kalit so'zlarni o'tkazib yuborsangiz, CURSOR o'rtasida va shuningdek, kalit so'zlardan foydalana olmaysiz. select_statement kalit so'zlar. CURSOR o'rtasida kalit so'zlarni belgilashda, shuningdek, uchun select_statement kalit so'zlar uchun CURSOR kalit so'zidan oldin SCROLL yoki INSESITIVE ni belgilay olmaysiz.

Agar siz DECLARE CURSOR bayonoti uchun Transact-SQL sintaksisidan foydalansangiz va READ_ONLY, OPTIMISTIC yoki SCROLL_LOCKS parametrlarini belgilamasangiz, quyidagi standart qiymat qabul qilinadi.

    Agar SELECT iborasi yangilanishlarni qo'llab-quvvatlamasa (yoki etarli ruxsatnomalarga ega bo'lmasa yoki yangilanishlarni qo'llab-quvvatlamaydigan masofaviy jadvallarga kirsa va hokazo), kursor READ_ONLY ga o'rnatiladi.

    STATIC va FAST_FORWARD kursorlari sukut bo‘yicha READ_ONLY.

    DYNAMIC va KEYSET kursorlari sukut bo'yicha OPTIMISTIC hisoblanadi.

Kursorlarga faqat boshqa Transact-SQL bayonotlari orqali murojaat qilish mumkin. Maʼlumotlar bazasi API funksiyalari kursorlarga havola qila olmaydi. Masalan, kursor e'lon qilingandan so'ng, OLE DB, ODBC yoki ADO funktsiyalari va usullari uning nomiga murojaat qila olmaydi. Kursor qatorlarini tegishli API funksiyalari va usullaridan foydalanib tanlash mumkin emas; Buning uchun siz Transact-SQL FETCH bayonotlaridan foydalanishingiz kerak.

Kursor e'lon qilingandan keyin uning xususiyatlarini aniqlash uchun quyidagi saqlangan protseduralardan foydalanish mumkin.

O'zgaruvchilar qism sifatida ishlatilishi mumkin select_statement, unda kursor e'lon qilinadi. Kursor o'zgaruvchilari qiymatlari e'lon qilinganidan keyin o'zgarmaydi.

Odatiy bo'lib, KURSORni E'lon qilish ruxsatlari kursor tomonidan ishlatiladigan ko'rinishlar, jadvallar va ustunlar bo'yicha SELECT ruxsatiga ega bo'lgan barcha foydalanuvchilarga beriladi.

Klasterli ustunlar do'koni indeksiga ega jadvalda kursorlar yoki triggerlardan foydalana olmaysiz. Bu cheklov klasterlanmagan indekslarga taalluqli emas; Siz kursorlar va triggerlardan klasterli bo'lmagan ustunlar do'koni indeksiga ega jadvalda foydalanishingiz mumkin.

A. Oddiy kursor va sintaksisdan foydalanish

Ushbu kursorni ochganingizda yaratilgan natijalar to'plami jadvalning barcha satr va ustunlarini o'z ichiga oladi. Ushbu kursor yangilanishi mumkin, barcha yangilanishlar va o'chirishlar ushbu kursor uchun tanlovda ko'rsatilgan. FETCH``NEXT faqat SCROLL parametri belgilanmaganligi sababli olinadi.

vend_cursor KURSORNI TANLASH UCHUN E'LON QILING.

B. Hisobotni ko'rsatish uchun o'rnatilgan kursorlardan foydalanish

Quyidagi misol murakkab hisobotni ko'rsatish uchun o'rnatilgan kursorlardan foydalanadi. Har bir provayder uchun ichki kursor e'lon qilinadi.

NOCOUNT NI YOQISH ; DECLARE @vendor_id int , @vendor_name nvarchar ( 50 ), @message varchar ( 80 ), @product nvarchar ( 50 ); Chop etish" -------- Sotuvchi mahsulotlari to'g'risidagi hisobot --------"; Vendor_cursor KURSORNI TANLANGAN VendorID, Purchasing.Vendor FROM NOMI UCHUN E'LON QILING. vendor_cursorni OCHISH @vendor_id, @vendor_name INTO INTO vendor_cursorDAN KEYINGI OLISH @@FETCH_STATUS = 0 BEGIN PRINT " " SELECT @message = "----- Sotuvchidan olingan mahsulotlar:"+ @vendor_name PRINT @xabar -- Asoslangan ichki kursorni e'lon qilish -- tashqi kursordan vendor_id-da. Purchasing.ProductVendor pv, Production.Mahsulot v WHERE pv.ProductID = v.ProductID VA pv.VendorID = @vendor_id dan tanlab olish uchun mahsulot_kursorini E'lon qiling. -- Tashqi kursordan o'zgaruvchan qiymat mahsulot_kursorini OCHISH AGAR @@FETCH_STATUS bo'lsa, mahsulot_kursoridan keyingi @mahsulotga OLISH<>0 BOSIB "<>" WHILE @@FETCH_STATUS = 0 TALANLASH @message = " " + @mahsulotni PRINT @xabar mahsulot_kursoridan KEYINGI KELISH @mahsulotga SOʻNGI mahsulot_kursorini YAPISH mahsulot_kursorini BOSHLASH -- Keyingi sotuvchini oling. KEYINGI INTO @_vendor vendor, vendor_cursorni TUG'IRISH; vendor_cursorni BO'LASH;

Mijozning oddiy so'roviga javob ko'pchilik mijozlar uchun hazm bo'lmaydigan yuz minglab qatorlar namunasi bo'lishi mumkin. Bunday holda, mijozlar bilan o'zaro munosabatlar muammosini hal qilish kursorlarni server va mijoz o'rtasida ma'lumotlar almashinuvining universal mexanizmi sifatida ishlatishdir. Kursorlar ma'lumotlarning natijalar to'plami (so'rov natijasi) bilan ishlaydi, bu foydalanuvchilarga ma'lumotlarni qayta ishlashning qo'shimcha imkoniyatlarini beradi:

Kursorlar ma'lumotlar to'plamida ularning seriya raqamini ko'rsatish orqali jadval qatorlari bilan ishlash imkonini beradi;

Kursorlar sizga murakkab ma'lumotlarni o'zgartirish operatsiyalarini amalga oshirishga imkon beradi, masalan, ustun qiymatini o'zgartirish boshqa ustunlar qiymatlariga qayta-qayta kirishni talab qilganda.

Kursorning hayot aylanishi:

Kursor yaratish: E'lon qiling<имя курсора>[ SEZOR ] [ SCROL ] KURSOR UCHUN< SELECT -оператор>UCHUN (FAQAT OʻQISH | YANGILASH)

Bu erda INSENSITIVE kalit so'zi kursorning statik bo'lishini anglatadi (ma'lumotlarning oniy tasviri), sukut bo'yicha kursor dinamik tarzda yaratilgan (olish har safar qatorga kirishda amalga oshiriladi). SCROLL kalit so'zi kursorni istalgan yo'nalishda aylantirish mumkinligini bildiradi, aks holda kursor "ketma-ket" kursor sifatida yaratiladi.

Kursorni ochish: OCHIQ [GLOBAL]<имя курсора>. GLOBAL deb belgilangan kursor, u chaqirilgan protsedura yoki paket tugashi bilan avtomatik ravishda o'chirilmaydi.

O'qishma'lumotlar : OLISH [[ KEYINGI | OLDINDAN | BIRINCHI | OXIRGI | ABSOLUTE n | NISBIY n ] FROM ] [ GLOBAL ]<имя курсора>[INTO@variable_name,...]. SQL Server 2000 kursordan faqat bitta qatorni o'qish imkonini beradi. FIRST kalit so'zi kursorning birinchi qatorini qaytarishdir; LAST – kursorning oxirgi qatori; NEXT – joriy satrdan keyingi keyingi satr, qaytarilgan qator joriyga aylanadi; PRIOR – joriydan oldingi; ABSOLUTE n – kursordagi mutlaq tartib raqami bo‘yicha qatorni qaytaradi; RELATIVE – joriy satrdan keyin n qator. Ustun ma'lumotlari belgilangan o'zgaruvchilarning har birida ular ro'yxatga olingan tartibda saqlanadi.

Ma'lumotlarni o'zgartirish: kursorlar bilan ishlash uchun mo'ljallangan sintaksisi bilan UPDATE buyrug'ini bajaradi.

Ma'lumotlarni o'chirish: kursorlar bilan ishlash uchun mo'ljallangan sintaksisi bilan DELETE buyrug'ini bajaradi.

Kursorni yopish: YAPISH [GLOBAL]<имя курсора>

Kursorni qo'yib yuboring: BOSHQARISH [GLOBAL]<имя курсора>

Kursordan foydalanishga misol:

DECLARE fo_curs KURSOR STATIC FOR

ORDER BY name_rus uchun name_rus ni tanlang

DECLARE @name varchar(50)

FETCH FROM FROM FIRST FROM INTO INTO @name

WHILE @@FETCH_STATUS=0

FETCH FROM NEXT FROM fo_curs INTO @name

DEALLOCATE fo_curs

2.7. Microsoft SQL Serverda ma'lumotlar xavfsizligi va yaxlitligini ta'minlash. Ma'lumotlar bazasini boshqarish. Rollar. Foydalanuvchilarga huquqlar berish (TRANSFOR, RAD ET, REVOKE). SQL Serverda ma'lumotlarni himoya qilish usullari va texnologiyalari.

SQL Server xavfsizligi va boshqaruvi. .

Ma'lumotlar bazasining asosiy vazifasi tanlangan mavzu doirasidagi ma'lumotlarning yaxlitligi va izchilligini ta'minlashdan iborat. Tizimning ushbu muammoni hal qilishiga to'sqinlik qiluvchi omillardan biri tasodifiy yoki ataylab ma'lumotlar strukturasini yo'q qilishga yoki ma'lumotlarning o'zini o'zgartirishga harakat qiladigan foydalanuvchilarning harakatlaridir. Binobarin, ma'lumotlar bazasini nafaqat jismoniy nosozliklardan, balki amalga oshirilayotgan vazifalarni bajarish uchun etarli bo'lmagan foydalanuvchilardan ham himoya qilish kerak. Buning uchun foydalanuvchilarning o'z vakolatlaridan tashqari harakatlarni amalga oshirishiga to'sqinlik qiladigan xavfsizlik tizimini loyihalash va ma'lumotlar bazasiga ulash zarur.

Ma'lumotlar bazasini boshqarish

TSQL yordamida ma'lumotlar bazasini yaratish uchun CREATE DATABASE buyrug'idan foydalaning, lekin odatda bu maqsadda SQL Server Management Studio imkoniyatlaridan foydalaniladi. IN SQL server Ma'lumotlar bazasida juda ko'p operatsiyalar aniqlangan: fayl o'lchamlarini oshirish (kamaytirish), konfiguratsiyani o'zgartirish (ALTER buyrug'i), biriktirish va ajratish, egalik huquqini o'tkazish, nomni o'zgartirish, xususiyatlarni ko'rish va nihoyat, o'chirish (DROP DATABASE).

Ko'pgina ma'lumotlar bazasi serverlari singari, SQL Server ham to'liq ma'muriy huquqlarga ega bo'lgan foydalanuvchiga ega - bu Tizim administratori yoki "sa". Dastlabki server o'rnatilgandan so'ng, sa paroli bo'sh. Yangi ma'lumotlar bazasini yaratgan foydalanuvchi avtomatik ravishda uning egasiga aylanadi ('dbo' - Ma'lumotlar bazasi egasi).Ma'lumotlar bazasi yaratilayotganda foydalanuvchining "mehmoni" ham aniqlanadi.Agar foydalanuvchi hisobi foydalanuvchi bilan aniq ko'rsatilmagan bo'lsa. ma'lum bir ma'lumotlar bazasida foydalanuvchi mehmon nomidan foydalanish bilan yashirin kirish huquqiga ega. Mehmon odatda taqiqlanadi.

Ma'lumotlar bazasida ob'ekt yaratgan foydalanuvchi avtomatik ravishda uning egasiga aylanadi va hech kim, shu jumladan dbo va sa, egasi unga huquqlarni tayinlamaguncha ushbu ob'ektdan foydalana olmaydi. Lekin foydalanuvchi ob'ektni yaratishi uchun ma'lumotlar bazasi egasi birinchi navbatda unga tegishli huquqlarni berishi kerak.

Rol boshqaruvni soddalashtirish uchun bir xil funktsiyalarni bajaradigan foydalanuvchilarni birlashtirishga imkon beradi. Rollar o'rnatilgan yoki moslashtirilgan bo'lishi mumkin. O'rnatilgan rollar server darajasida va ma'lumotlar bazasi darajasida amalga oshiriladi. Quyida o'rnatilgan ma'lumotlar bazasi rollari jadvali keltirilgan:

db_owner. Ma'lumotlar bazasida barcha huquqlarga ega

Db_accessadmin. Foydalanuvchilarni qo'shish yoki o'chirish mumkin

Db_securityadmin. Barcha ruxsatlar, ob'ektlar, rollar va foydalanuvchilarni boshqaradi

Db_ddladmin. GRANT, DENY, REVOKE dan tashqari barcha DDL buyruqlarini bajarishi mumkin

Db_backupoperator. Arxivator buyruqlarni bajarishi mumkin. ma'lumotlar

db_datareader. Balki ko'rish. har qanday jadvaldagi har qanday ma'lumotlar

db_datawriter. Ehtimol, modifikatsiya. har qanday jadvaldagi har qanday ma'lumotlar

Db_denydatareader. Taqiqlangan ko'rinish sevgi har qanday ma'lumotlar jadvallar

Db_denydatawriter. Har qanday jadvaldagi ma'lumotlarni o'zgartirishni taqiqlang

Foydalanuvchilarga huquqlarni berish. SQL Server xavfsizligining asosi (1) Hisoblar(hisob-kitoblar); (2) foydalanuvchilar; (3) rollar; (4) guruhlar.

Foydalanuvchi SQL Serverga ulanganda, u bajarishi mumkin bo'lgan harakatlar unga foydalanuvchi va rol a'zosi sifatida berilgan huquqlar bilan belgilanadi. Huquqlar ma'lumotlar bazasi ma'muri, ma'lumotlar bazasi egasi yoki ma'lum bir ma'lumotlar bazasi ob'ektining egasi tomonidan beriladi. Ma'lumotlar bazasidagi huquqlarni uch toifaga bo'lish mumkin: (1) ma'lumotlar bazasi ob'ektlariga kirish huquqi; (2) TSQL buyruqlarini bajarish huquqlari; (3) yashirin huquqlar. Server sizga egalik huquqini bir foydalanuvchidan boshqasiga o'tkazish imkonini beradi.

Ma'lumotlar bazasi ob'ektlariga kirish uchun foydalanuvchi ruxsatlarini boshqarish uchun quyidagi buyruqlar qo'llaniladi:

Grant(HAMMA |< вид действия >,…}

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

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

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

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

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

foydalanuvchilarga huquqlarni berish, Qayerda

ALL - foydalanuvchiga barcha mumkin bo'lgan ruxsatlar beriladi, aks holda belgilang

<вид действия>- foydalanuvchi uchun mavjud bo'lgan harakatlarga bo'lgan huquqlar, xususan:

SELECT - ko'rish uchun, jadval ustuni va jadval uchun (ko'rish)

INSERT – jadval (ko‘rinish) uchun bir butun sifatida qo‘shish

UPDATE - o'zgartirish uchun, jadval ustuni va jadval uchun (ko'rish)

DELETE – butun jadval (ko‘rinish) uchun o‘chirish

EXECUTE – saqlangan protseduralarni bajarish uchun

MA'LUMOTLAR - ko'rsatilgan ob'ektga murojaat qilish qobiliyati (uni tashqi kalitning bir qismi sifatida kiritish).

<имя объекта системы безопасности>– SQL Server hisoblari, Windows domen foydalanuvchilari; PUBLIC – barcha foydalanuvchilar uchun.

GRANT OPTION BILAN - hozirda huquqlar berilgan foydalanuvchiga boshqa foydalanuvchilarga ob'ektga kirish huquqini belgilash imkonini beradi.

AS<имя группы> | <имя роли>- foydalanuvchining boshqa foydalanuvchilarga huquqlar berish imkoniyati berilgan roldagi ishtiroki.

Mualliflarni Ommaga TANLASH

Meri, Jon va Tomga mualliflarni qo'shish, yangilash, o'chirish

Buxgalteriya hisobiga Plan_Ma'lumotlarini GRANT VARIANTI BILAN TANLASH

Jek AS Buxgalteriya hisobiga Plan_Data TANLOVCHI BERING

Jek Buxgalteriya rolining a'zosi emas, lekin bu roldagi kimdir ruxsat berishi mumkin

INDOR(HAMMA |< вид действия >,…}

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

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

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

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

kirishni rad etish foydalanuvchilar ma'lumotlar bazasi ob'ektlariga. CASCADE nafaqat huquqlarni bekor qiladi berilgan foydalanuvchi, balki u huquq bergan har bir kishi uchun ham.

Misol (yoqilgan buyruqni taqiqlash TSQL):

Jek CASCADE UCHUN JADVAL YARATISHNI INDOR QILING

Jamoa BEKOR QILISh ma'lumotlar bazasi ob'ektlariga kirishni bilvosita rad etish uchun ishlatiladi. Sintaksis DENY buyrug'i bilan bir xil. Yashirin rad etish kirishni rad etishga o'xshaydi, faqat u belgilangan darajada amal qiladi. Misol: GoodUsers rolining a'zosi bo'lgan foydalanuvchi Jek XFiles jadvaliga kirish huquqiga ega. Agar ushbu jadvalga kirish uchun GoodUsers roli uchun REVOKE rad etilsa, Jek bu jadvalga kirishi mumkin, chunki uning huquqlari aniq belgilangan. Agar siz uning uchun REVOKE-dan shaxsan foydalansangiz, u XFiles-ga kirish huquqini yo'qotadi.

Rollarga berilgan ruxsatlar ularning a'zolari tomonidan meros qilib olinadi. Agar foydalanuvchiga bir rolga a'zolik orqali ob'ektga kirish huquqi berilsa, lekin boshqa rolda rad etilsa, kirish nizosi har doim rad etish foydasiga hal qilinadi.

MS SQL Serverda ma'lumotlarni himoya qilish texnologiyalari

1. Mexanizm nazorat punktlari- yangilangan sahifalarni diskka yozish uchun ~60 soniyadan keyin yaratiladigan nazorat nuqtalari (nazorat punkti CHECKPOINT buyrug'i bilan majburiy bo'lishi mumkin).

2. Ma'lumotlar bazasining yaxlitligini tekshirish uchun o'rnatilgan va tashqi mexanizmlar (avtomatik ravishda ishga tushiriladi yoki DBCC yordam dasturi kabi - Ma'lumotlar bazasi izchilligini tekshirish - qo'lda).

3.Operatsion tizim (shu jumladan, aks ettirilgan qattiq disklar mexanizmi) yordamida ma'lumotlar bazasi fayllarini jismoniy takrorlash (ruxsat etilgan bo'lsa).

4. Ma'lumotlar bazalari va tranzaksiya jurnallarining zahira nusxasini yaratish - zaxira qurilmasiga (magnit lenta yoki qattiq disk) ma'lumotlar bazasi dumpini yozish orqali.

5. Replikatsiya - ma'lumotni vaqti-vaqti bilan (ba'zi hollarda, sinxron ravishda) bir SQL serveridan boshqasiga o'tkazish orqali takrorlash imkoniyati.

6. Mijoz va server o'rtasidagi trafikni shifrlash, shuningdek, ma'lumotlar bazasi ob'ektlari (saqlanuvchi protseduralar, triggerlar va boshqalar) bilan ishlash uchun ishlatiladigan kodlarni shifrlash.

1) Kursor tushunchasi
Interaktiv SQL bir qatorli va ko'p qatorli so'rovlarni farqlamaydi. O'rnatilgan SQL bu so'rovlarni boshqacha bajaradi. Bir qatorli so'rovlar bir qatorni qaytaradi va biz ularni allaqachon ko'rib chiqdik. Agar so'rov natijasi bir nechta satr bo'lsa, o'rnatilgan SQL ilovaga so'rov natijalarini satr bo'yicha olish imkonini berishi kerak. Buning uchun kursorlar ishlatiladi. Kursor so'rov bilan bog'langan o'zgaruvchidir. Uning qiymati so'rovga mos keladigan har bir satrdir. O'zgaruvchilar singari, kursorlar ham foydalanishdan oldin e'lon qilinishi kerak. Ko'rinishlardan farqli o'laroq, kursorlar qatorga ishlov berish uchun mo'ljallangan.

2) Kursor deklaratsiyasi

E'lon qiling [{}] [[YO'Q] SROLL] KURSOR [{BILAN|BILGAN} TUTMOQ] UCHUN [UCHUN {FAQAT O‘QISH|YANGILANISH [OF ]}]

3) Kalit so'zlar
. SENSITIVE|SEZSIZ|SESSOR– natijalar to‘plamidagi o‘zgarishlar ko‘rinadi | taqiqlangan (ma'lumotlar to'plamining nusxasi yordamida o'rnatilgan)|Nusxa yaratish yoki yo'qligini DBMS o'zi hal qiladi (sukut bo'yicha ishlaydi).
. BILAN|TUTMAGAN– ochiq barglar | Agar COMMIT bayonotiga duch kelsangiz, kursorni yopadi.
. SROLL– Natija qatorlarini tasodifiy tartibda chiqarishni [oldini oladi].
. FAQAT O'QISH UCHUN- faqat o'qish uchun kursorni belgilaydi.
. YANGILANISH UCHUN– faqat belgilangan ustunlarni yangilashni bloklaydi.

4) SQL Serverda kursorni e'lon qilish

E'lon qiling KURSOR [LOCAL|GLOBAL] [FORWARD_ONLY|YUQING] [STATIC|KEYSET|DINAMIK|TEZ_OLGAN] [FAQAT READ_FAQAT|SCROLL_LOCKS|OPTIMIST] UCHUN [YANGILANISH UCHUN [OF ]]

. STATIK– Kursor foydalanishi uchun maʼlumotlarning vaqtinchalik nusxasini yaratuvchi kursorni belgilaydi. Kursorga qarshi barcha so'rovlar tempdb ma'lumotlar bazasidagi belgilangan vaqtinchalik jadvalga kirishadi, shuning uchun asosiy jadvallarga o'zgartirishlar ushbu kursor uchun namunalar tomonidan qaytarilgan ma'lumotlarga ta'sir qilmaydi va kursorning o'zi o'zgartirishlar kiritishga ruxsat bermaydi.
. Klaviatura toʻplami– Kursor ochilgandan keyin a’zolik yoki qatorlar tartibi o‘zgarmasligini bildiradi. Qatorlarni noyob tarzda identifikatsiya qiluvchi kalitlar to'plami tempdb ma'lumotlar bazasida keyset deb nomlangan jadvalga kiritilgan.
. DINAMIK– Ushbu kursorni ko'rishda natijalar to'plamining qatorlariga kiritilgan barcha ma'lumotlar o'zgarishlarini aks ettiruvchi kursorni belgilaydi. Har bir tanlovdagi maʼlumotlar qiymatlari, tartib va ​​qator aʼzoligi farq qilishi mumkin. ABSOLUTE tanlash opsiyasi dinamik kursorlar tomonidan qo'llab-quvvatlanmaydi.
. TEZDA OLDINGA– Ishlashni optimallashtirish yoqilgan FORWARD_ONLY, READ_ONLY kursorini bildiradi. FAST_FORWARD parametrini SCROLL yoki FOR_UPDATE parametrlari bilan belgilab bo‘lmaydi.
. SCROLL_LOCKS– Kursor orqali amalga oshirilgan joylashtirilgan yangilanishlar yoki oʻchirishlar muvaffaqiyatli boʻlishi kafolatlanganligini bildiradi. SQL Server keyingi o'zgarishlar uchun mavjud bo'lishini ta'minlash uchun kursorda o'qilgan qatorlarni qulflaydi. SCROLL_LOCKS parametrini FAST_FORWARD yoki STATIC parametrlari bilan belgilab bo‘lmaydi.
. OPTIMIST– Agar satr kursorda o‘qilgan paytdan boshlab yangilangan bo‘lsa, kursor orqali o‘rnatilgan yangilanishlar yoki o‘chirishlar muvaffaqiyatsiz bo‘lishini ko‘rsatadi. SQL Server kursorda o'qilgan qatorlarni bloklamaydi. Buning o'rniga, kursorda o'qilgandan so'ng satr o'zgarganligini aniqlash uchun vaqt tamg'asi ustunining qiymatlari (yoki jadvalda vaqt tamg'asi ustuni bo'lmasa, nazorat summalari) bilan taqqoslash amalga oshiriladi. Agar qator o'zgartirilgan bo'lsa, uning joylashuvini o'zgartirish yoki o'chirish mumkin emas. OPTIMIST opsiyasini FAST_FORWARD opsiyasi bilan belgilab bo‘lmaydi.

5) Kursorni ochish

6) Kursordan qatorlarni olish

OLISH [{KEYINGI|OLGAN|BIRINCHI|OXIRGI|{ABSOLUTE|NISBIY }}]
FROM ICHIGA

7) Kursorni joylashtirish imkoniyatlari
. KEYINGI|OLGAN|BIRINCHI|OXIRGI– natijalar to‘plamining keyingi|oldingi|birinchi|oxirgi qatoriga.
. NISBIY ±N- joriy chiziqqa nisbatan ijobiy yoki salbiy ofsetga ega bo'lgan chiziqqa.
. ABSOLUTE ±N– kursor boshidan yoki oxiridan aniq belgilangan mutlaq pozitsiya raqamiga ega bo'lgan qatorga.

Eslatma: SQL Server N o'rniga @N butun o'zgaruvchiga ruxsat beradi.

8) Kursorni yopish

9) Kursorlar bo'yicha eslatmalar
. Agar kursorda bir nechta satr bo'lsa, undan ma'lumotlarni olish uchun tsiklni tashkil qilish kerak, vaqti-vaqti bilan oxirgi qatorga etib borishni tekshiring.
. Jadvallar va ko'rinishlardan farqli o'laroq, kursor satrlari bo'lim yordamida aniq tartiblanadi Buyurtma berish, yoki ma'lum bir ma'lumotlar bazasida qabul qilingan konventsiyalarga muvofiq.
. Kursorlar, shuningdek, bir vaqtning o'zida yangilanishi yoki o'chirilishi mumkin bo'lgan jadvallardan qatorlar guruhlarini tanlash uchun ishlatiladi.
. Kursor yangilanishi uchun u ko'rinish bilan bir xil mezonlarga javob berishi kerak, ya'ni bo'limlarni o'z ichiga olmaydi. UNION, TARTIBI BO'YICHA, GURUH BO'YICHA, DISTINCT.

10) Kursordan ma'lumotlarni o'chirishga misol

exec sql mijozdan * tanlash uchun kursorni Cur1 e'lon qiladi
qaerda Reyting
// chop etish (@f1+’ ‘+convert(Varchar(5),@f2))
exec sql-ni mijozdan o'chirish
bu erda Cur1 oqimi; ) – Kursordan oʻchirish uchun maʼlumotlarni oling
tugallanmagan:
exec sql kursorini yopish Cur1; — Kursorni yoping
Chiqish();

11) Komissiyalarni oshirishga misol

exec sql SalesPeople-dan * tanlash uchun kursor CurCustni e'lon qiladi
bu yerda SNum in (Mijozdan SNum ni tanlang, bunda Reyting=300); - Kursorni belgilang
exec sql ochiq kursor CurCust; - Kursorni bajaring
while (sqlca.sqlcode==0) ( — Jadvaldagi maʼlumotlarni yangilash uchun sikl yaratish
exec sql CurCust-ni:Id_num, :SalesPerson, :Loc, :Comm ichiga olib keladi;
exec sql update SalesPeople o'rnating Comm=Comm+.01 qaerda joriy
CurCust; ) – Kursordan ma’lumotlarni yangilash uchun oling
exec sql kursorini yopish CurCust; — Kursorni yoping

S.Name, MAX(S.Shahar) AS SAHAR, SUM(O.Amt) AS Amt ASAN SalesPeople S INNER JOIN Buyurtmalar O ON S.SNum=O.SNum GROUP BY S.Name BY 2 TARTIBI

S.Name, MAX(S.Sity) AS shahar, SUM(O.Amt) AS Amt AS UCHUN Cur1 AYLANTIRISH KURSORNI E’lon qiling. Savdochilar S ICHKI QO‘SHILMALAR Buyurtmalar O ON S.SNum=O.SNum GROUP BY S.Name 2 BO‘YICHA TARTIB
Cur1 ni Oching
Cur1DAN KEYINGI OLISH
WHILE @@FETCH_STATUS=0
BOSHLANISHI
Cur1DAN KEYINGI OLISH
OXIRI
Cur1
DEALLOCATE Cur1