Какво е CURSOR в PL / SQL?
Курсорът е указател към тази контекстна област. Oracle създава контекстна област за обработка на SQL израз, който съдържа цялата информация за него.
PL / SQL позволява на програмиста да контролира контекстната област чрез курсора. Курсор съдържа редовете, върнати от SQL израза. Наборът от редове, които курсорът съдържа, се нарича активен набор. Тези курсори също могат да бъдат именувани, така че да могат да бъдат препращани от друго място на кода.
В този урок ще научите-
- Имплицитен курсор
- Изричен курсор
- Атрибути на курсора
- За изявление на курсора на цикъла
Курсорът е от два вида.
- Имплицитен курсор
- Изричен курсор
Имплицитен курсор
Винаги, когато се появят някакви DML операции в базата данни, се създава неявен курсор, който съдържа засегнатите редове в тази конкретна операция. Тези курсори не могат да бъдат именувани и следователно не могат да бъдат контролирани или препращани от друго място на кода. Можем да се позоваваме само на най-новия курсор чрез атрибутите на курсора.
Изричен курсор
Програмистите имат право да създават имена на контекстна област, за да изпълняват своите DML операции, за да получат повече контрол над нея. Изричният курсор трябва да бъде дефиниран в раздела за декларация на блока PL / SQL и той е създаден за оператора 'SELECT', който трябва да се използва в кода.
По-долу са дадени стъпки, които включват работа с явни курсори.
- Деклариране на курсора
Декларирането на курсора просто означава да се създаде една именувана контекстна област за израза 'SELECT', който е дефиниран в частта на декларацията. Името на тази контекстна област е същото като името на курсора.
- Отварящ курсор
Отварянето на курсора ще инструктира PL / SQL да разпредели паметта за този курсор. Това ще направи курсора готов за извличане на записите.
- Извличане на данни от курсора
В този процес се изпълнява операторът 'SELECT' и извлечените редове се съхраняват в разпределената памет. Сега те се наричат активни набори. Извличането на данни от курсора е дейност на ниво запис, което означава, че можем да осъществим достъп до данните по начин по запис.
Всеки оператор за извличане ще извлече един активен набор и съдържа информацията от този конкретен запис. Този оператор е същият като оператора „SELECT“, който извлича записа и присвоява на променливата в клаузата „INTO“, но няма да създаде изключения.
- Затваряне на курсора
След като целият запис бъде извлечен сега, трябва да затворим курсора, така че паметта, разпределена за тази контекстна област, да бъде освободена.
Синтаксис:
DECLARECURSORIS
- В горния синтаксис декларационната част съдържа декларацията на курсора и променливата на курсора, в която ще бъдат присвоени извлечените данни.
- Курсорът се създава за израза 'SELECT', който е даден в декларацията на курсора.
- В частта за изпълнение декларираният курсор се отваря, извлича и затваря.
Атрибути на курсора
И неявният курсор, и експлицитният курсор имат определени атрибути, които могат да бъдат достъпни. Тези атрибути дават повече информация за операциите с курсора. По-долу са посочени различните атрибути на курсора и тяхното използване.
Атрибут на курсора | Описание |
% НАМЕРЕН | Той връща булевия резултат „TRUE“, ако последната операция за извличане е извлекла запис успешно, в противен случай ще върне FALSE. |
% НЕ НАМЕРЕН | Това работи обратно на% FOUND, ще върне „TRUE“, ако последната операция за извличане не може да извлече никакъв запис. |
%Е ОТВОРЕНО | Той връща булев резултат „TRUE“, ако даденият курсор вече е отворен, в противен случай връща „FALSE“ |
% ROWCOUNT | Той връща числовата стойност. Той дава действителния брой записи, засегнати от DML активността. |
Пример 1 : В този пример ще видим как да декларираме, отворим, извлечем и затворим изричния курсор.
Ще проектираме цялото име на служителя от emp таблица с помощта на курсор. Също така ще използваме атрибут cursor, за да зададем цикъла за извличане на целия запис от курсора.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;END IF;Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name);END LOOP;Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT);CLOSE guru99_det;END:/
Изход
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Обяснение на кода:
- Код ред 2 : Деклариране на курсора guru99_det за израз „SELECT emp_name FROM emp“.
- Кодов ред 3 : Деклариране на променлива lv_emp_name.
- Кодов ред 5 : Отваряне на курсора guru99_det.
- Кодов ред 6: Задаване на оператора Basic loop за извличане на всички записи в таблицата 'emp'.
- Кодов ред 7: Извлича данните guru99_det и присвоява стойността на lv_emp_name.
- Кодов ред 9: Използване на атрибута на курсора „% NOTFOUND“, за да откриете дали целият запис в курсора е извлечен. Ако бъде извлечен, той ще върне „TRUE“ и контролът ще излезе от цикъла, в противен случай контролът ще продължи да извлича данните от курсора и да ги отпечатва.
- Кодов ред 11: Условие EXIT за оператора за цикъл.
- Код ред 12: Отпечатайте извлеченото име на служител.
- Кодов ред 14: Използване на атрибута на курсора „% ROWCOUNT“ за намиране на общия брой записи, които са засегнати / извлечени в курсора.
- Кодов ред 15: След излизане от цикъла курсорът се затваря и освободената памет се освобождава.
За изявление на курсора на цикъла
Изразът "FOR LOOP" може да се използва за работа с курсори. Можем да дадем името на курсора вместо ограничение на обхвата в оператора за цикъл FOR, така че цикълът да работи от първия запис на курсора до последния запис на курсора. Променливата на курсора, отварянето на курсора, извличането и затварянето на курсора ще се извършват имплицитно от цикъла FOR.
Синтаксис:
DECLARECURSORIS
- В горния синтаксис декларационната част съдържа декларацията на курсора.
- Курсорът се създава за израза 'SELECT', който е даден в декларацията на курсора.
- В частта за изпълнение декларираният курсор се настройва в цикъла FOR и променливата на цикъла „I“ ще се държи като променлива на курсора в този случай.
Пример 1 : В този пример ще проектираме цялото име на служител от emp таблица, използвайки цикъл на курсор-FOR.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Изход
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Обяснение на кода:
- Код ред 2 : Деклариране на курсора guru99_det за израз „SELECT emp_name FROM emp“.
- Код ред 4 : Изграждане на цикъла „ЗА“ за курсора с променливата на цикъла lv_emp_name.
- Кодов ред 5: Отпечатване на името на служителя във всяка итерация на цикъла.
- Кодов ред 8: Излезте от цикъла
Забележка: В цикъл Cursor-FOR атрибутите на курсора не могат да се използват, тъй като отварянето, извличането и затварянето на курсора се извършва имплицитно от FOR цикъл.