Oracle PL/SQL курсор: имплицитно, явно, For Loop с пример
Какво е CURSOR в PL/SQL?
Курсорът е указател към тази контекстна област. Oracle създава контекстна област за обработка на SQL израз, който съдържа цялата информация за израза.
PL/SQL позволява на програмиста да контролира контекстната област чрез курсора. Курсорът държи редовете, върнати от SQL оператора. Наборът от редове, които курсорът държи, се нарича активен набор. Тези курсори могат също да бъдат наименувани, така че да могат да бъдат препратени от друго място в кода.
Курсорът е два вида.
- Неявен курсор
- Явен курсор
Неявен курсор
Всеки път, когато се появят DML операции в базата данни, се създава скрит курсор, който държи засегнатите редове в тази конкретна операция. Тези курсори не могат да бъдат именувани и следователно не могат да бъдат контролирани или препращани от друго място в кода. Можем да се позоваваме само на най-новия курсор чрез атрибутите на курсора.
Явен курсор
На програмистите е позволено да създават именувана контекстна област, за да изпълняват своите DML операции, за да получат повече контрол върху нея. Изричният курсор трябва да бъде дефиниран в секцията за декларация на PL/SQL блоки е създаден за оператора „SELECT“, който трябва да се използва в кода.
По-долу са описани стъпките, които включват работа с изрични курсори.
- Деклариране на курсора Декларирането на курсора просто означава да се създаде една наименувана контекстна област за израза 'SELECT', който е дефиниран в частта за деклариране. Името на тази контекстна област е същото като името на курсора.
- Курсор за отварянеОтварянето на курсора ще инструктира на PL / SQL за да разпределите паметта за този курсор. Това ще направи курсора готов за извличане на записите.
- Извличане на данни от курсораВ този процес операторът 'SELECT' се изпълнява и извлечените редове се съхраняват в разпределената памет. Сега те се наричат активни комплекти. Извличането на данни от курсора е дейност на ниво запис, което означава, че имаме достъп до данните по начин запис по запис. Всеки оператор за извличане ще извлече един активен набор и ще съдържа информацията за този конкретен запис. Този оператор е същият като оператора 'SELECT', който извлича записа и го присвоява на променливата в клаузата 'INTO', но няма да хвърля никакви изключения.
- Затваряне на курсораСлед като целият запис бъде извлечен сега, трябва да затворим курсора, така че паметта, разпределена за тази контекстна област, да бъде освободена.
Синтаксис
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- В горния синтаксис частта за декларация съдържа декларацията на курсора и променливата на курсора, в която ще бъдат присвоени извлечените данни.
- Курсорът се създава за оператора „SELECT“, който е даден в декларацията на курсора.
- В частта за изпълнение декларираният курсор се отваря, извлича и затваря.
Атрибути на курсора
Както имплицитният курсор, така и експлицитният курсор имат определени атрибути, които могат да бъдат достъпни. Тези атрибути дават повече информация за операциите с курсора. По-долу са различните атрибути на курсора и тяхното използване.
Атрибут на курсора | Descriptйон |
---|---|
% НАМЕРЕНО | Връща булевия резултат „ВЯРНО“, ако последната операция за извличане е извлякла запис успешно, в противен случай ще върне НЕВЯРНО. |
%НЕНАМЕРЕНО | Това работи обратно на %FOUND и ще върне 'TRUE', ако последната операция за извличане не може да извлече никакъв запис. |
%ISOPEN | Връща булев резултат „TRUE“, ако дадения курсор вече е отворен, в противен случай връща „FALSE“ |
%ROWCOUNT | Връща числовата стойност. Той дава действителния брой записи, които са били засегнати от дейността на DML. |
Явен пример за курсор:
В този пример ще видим как да декларираме, отваряме, извличаме и затваряме изричния курсор.
Ще проектираме цялото име на служителя от emp таблица с помощта на курсор. Ще използваме и атрибута на курсора, за да настроим цикъла да извлича целия запис от курсора.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; 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:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Обяснение на кода
- Кодов ред 2: Деклариране на курсора guru99_det за оператор 'SELECT emp_name FROM emp'.
- Кодов ред 3: Деклариране на променлива lv_emp_name.
- Кодов ред 5: Отваряне на курсора guru99_det.
- Кодов ред 6: Настройване на оператора за основен цикъл за извличане на всички записи в таблицата „emp“.
- Кодов ред 7: Извлича данните guru99_det и присвоява стойността на lv_emp_name.
- Кодов ред 9: Използване на атрибута на курсора '%NOTFOUND', за да разберете дали всички записи в курсора са извлечени. Ако бъде извлечено, то ще върне „ВЯРНО“ и контролът ще излезе от цикъла, в противен случай контролът ще продължи да извлича данните от курсора и ще отпечата данните.
- Кодов ред 11: Условие EXIT за командата за цикъл.
- Кодов ред 12: Отпечатайте извлеченото име на служител.
- Кодов ред 14: Използване на атрибута на курсора '%ROWCOUNT' за намиране на общия брой записи, които са засегнати/извлечени в курсора.
- Кодов ред 15: След излизане от цикъла курсорът се затваря и разпределената памет се освобождава.
FOR Loop Cursor инструкция
Операторът “FOR LOOP” може да се използва за работа с курсори. Можем да дадем името на курсора вместо границата на обхвата в оператора на цикъла FOR, така че цикълът да работи от първия запис на курсора до последния запис на курсора. Променливата на курсора, отварянето на курсора, извличането и затварянето на курсора ще се извършва имплицитно от цикъла FOR.
Синтаксис
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- В горния синтаксис частта за декларация съдържа декларацията на курсора.
- Курсорът се създава за оператора „SELECT“, който е даден в декларацията на курсора.
- В частта за изпълнение декларираният курсор се настройва в цикъла FOR и променливата на цикъла 'I' ще се държи като променлива на курсора в този случай.
Oracle Курсор за пример за цикъл:
В този пример ще проектираме цялото име на служител от emp таблица, като използваме цикъл FOR на курсора.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name); END LOOP; END; /
Продукция
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Обяснение на кода
- Кодов ред 2: Деклариране на курсора guru99_det за оператор 'SELECT emp_name FROM emp'.
- Кодов ред 4: Конструиране на цикъла „FOR“ за курсора с променливата на цикъла lv_emp_name.
- Кодов ред 5: Отпечатване на името на служителя във всяка итерация на цикъла.
- Кодов ред 8: Излезте от цикъла
Забележка: В цикъл Cursor-FOR атрибутите на курсора не могат да се използват, тъй като отварянето, извличането и затварянето на курсора се извършва имплицитно от FOR цикъл.