Какво е курсорът в oracle
Oracle използва работна област, наречена Частни SQL области, за да изпълнява SQL изявления и да съхранява информация. Курсорът на Oracle е конструкция на PL/SQL, която ви позволява да наименувате тези работни области и да осъществявате достъп до тяхната съхранена информация
Типове курсори в Oracle
- Неявен курсор в Oracle
- Явен курсор в Oracle
Явни курсори
Явните курсори имат следните етапи
1) Деклариране:Ние декларираме името на курсора и дефинираме структурата на заявката
2) Open: Операторът open изпълнява заявката и обвързва всяка променлива, която е посочена. Редовете, идентифицирани от заявката, се наричат Активни набори. И сега това е достъпно за изтегляне
Какво е активен набор: Наборът от редове, върнати от многоредова заявка
Неговият размер е броят на редовете, който отговаря на вашите критерии за търсене
3) Извличане:На този етап редовете се извличат от курсора и след всяко извличане тествате курсора за всички останали редове, ако няма редове, продължавате със затварянето на курсора
4) Close:Операторът close освобождава активния набор от редове и можем отново да отворим курсора, за да извлечем обновяващ активен набор
Подробни етапи
Деклариране на курсор
- Име на курсора
- Структура на заявката
Syntax: CURSOR IS : It includes most of the usual clauses, but INTO Clause is not allowed Example: DECLARE CURSOR cur1 is SELECT address,salary,emp_no,emp_name FROM emp WHERE region=’US’; ……………………………… BEGIN ……………………………… END;
Отваряне на курсор
Тук се извършва синтактичен анализ и изпълнение на заявка. След отваряне на курсора, редовете, върнати от заявката, са достъпни за извличане.
Syntax: Open <cursor name> This statement is used within the executable section of the block. It also establishes an active set of the rows Example: OPEN cur1; DECLARE v_salary number; CURSOR cur1 is SELECT salary FROM emp WHERE region=’US’; BEGIN OPEN cur1; LOOP FETCH cur1 into v_salary; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE (v_salary); END LOOP; CLOSE cur1; END; /
Курсорът вече ще сочи към първия ред в активния набор.
Извличане на редовете
След отваряне на курсора текущият ред се зарежда в променливи. Текущият ред е редът, към който в момента сочи курсорът. Извличане на данни в PL/SQL променлива или хост
Променливата се извършва чрез израза FETCH
Syntax: FETCH INTO ;
- За всяка стойност на колона, върната от заявката, свързана с курсора, трябва да има
съответната променлива в списъка INTO.
- СЪЩО техните типове данни трябва да са съвместими
ЗАТВАРЯНЕ НА КУРСОР
Той изрично затваря курсора, позволявайки му да бъде отворен отново, ако е необходимо.
Syntax: CLOSE <cursor-name>; Example: CLOSE cur1 Example of Using CLOSE <Cursor Name> DECLARE v_address emp.address%TYPE; CURSOR cur1 is select address from emp; BEGIN OPEN cur1; LOOP FETCH cur1 into v_address; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_address); END LOOP; CLOSE cur1; END; /
Явни атрибути на курсора
Атрибут | Тип | Описание |
%ISOPEN | Булев | Оценява на TRUE, ако курсорът е отворен |
% НЕ НАМЕРЕНО | Булев | Оценява на TRUE, ако последното извличане не върне ред |
% НАМЕРЕНО | Булев | Оценява на TRUE, ако най-скорошното извличане върне ред |
%ROWCOUNT | NUMBER | Оценява общия брой върнати до момента редове |
Разширена концепция с курсора на Oracle
Курсор и записи на Oracle
1) Вече прочетохме за PLSQL записи.
2) Можем да обработим редовете на активния набор чрез извличане на стойности в PL/SQL запис също
3) Можем също да дефинираме plsql запис въз основа на избрания списък от колони в изричните курсори.
Пример
DECLARE CURSOR dept_cursor is Select deptno,dept_name FROM dept; dept_record dept_cursor%rowtype; BEGIN OPEN dept_cursor; LOOP FETCH dept_cursor INTO dept_record; Insert into dept_temp (deptno, deptname) values (dept_record.deptno, dept_record.dept_name); EXIT WHEN dept_cursor%notfound; END LOOP; Commit; CLOSE dept_cursor; END; /
Курсор с параметри/параметризиран курсор в оракул
Syntax: CURSOR cursor_name(parameter_name datatype, ) IS Select_statement;
1) Предайте стойностите на параметрите на курсора, когато курсорът е отворен и заявката се изпълнява
2) Отворете явен курсор няколко пъти с различни активни набори всеки път
Open cursor_name(parameter_value , ……);
Пример
DECLARE CURSOR cur1(v_deptno number) is Select deptname,dept_loc,dept_pincode from dept where deptno=v_deptno; Dept_record cur1%rowtype; l_deptno number:=111; BEGIN OPEN cur1(112); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; OPEN cur1(l_deptno); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; END; /
Сродни статии
Как да работите с дата в Oracle sql
Oracle PLSQL таблици
Всичко за Oracle PLSQL записи
Най-често задавани 25 въпроса за интервю за oracle plsql
блокова структура на Oracle PLSQL и променлива на Oracle PLSQL
Атрибути на курсора