В Oracle курсоры используются для извлечения данных из базы данных и управления ими. Они предоставляют механизм для перебора набора результатов и выполнения различных операций с данными. Вот несколько методов, обычно используемых с курсорами в Oracle, а также примеры кода:
-
Неявные курсоры:
- Неявные курсоры автоматически создаются Oracle для каждого выполняемого оператора SQL и используются для обработки набора результатов.
- Пример:
DECLARE emp_name VARCHAR2(100); BEGIN SELECT employee_name INTO emp_name FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || emp_name); END;
-
Явные курсоры:
- Явные курсоры — это определяемые пользователем курсоры, которые обеспечивают больший контроль над обработкой набора результатов.
- Пример:
DECLARE CURSOR c_employee IS SELECT employee_name FROM employees WHERE hire_date > SYSDATE - 365; emp_name VARCHAR2(100); BEGIN OPEN c_employee; LOOP FETCH c_employee INTO emp_name; EXIT WHEN c_employee%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || emp_name); END LOOP; CLOSE c_employee; END;
-
Атрибуты курсора:
- Атрибуты курсора предоставляют информацию о состоянии курсора.
- Пример:
DECLARE CURSOR c_employee IS SELECT employee_name FROM employees; BEGIN OPEN c_employee; IF c_employee%ISOPEN THEN DBMS_OUTPUT.PUT_LINE('Cursor is open.'); END IF; IF c_employee%FOUND THEN DBMS_OUTPUT.PUT_LINE('At least one row is fetched.'); END IF; IF c_employee%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('No rows are fetched.'); END IF; CLOSE c_employee; END;
-
Курсор цикла FOR:
- Цикл FOR упрощает обработку курсора, автоматически открывая, извлекая и закрывая курсор.
- Пример:
BEGIN FOR emp_rec IN (SELECT employee_name FROM employees) LOOP DBMS_OUTPUT.PUT_LINE('Employee Name: ' || emp_rec.employee_name); END LOOP; END;
-
Параметры курсора:
- Параметры курсоров позволяют передавать значения курсорам, что делает их более гибкими.
- Пример:
DECLARE CURSOR c_employee (p_dept_id NUMBER) IS SELECT employee_name FROM employees WHERE department_id = p_dept_id; emp_name VARCHAR2(100); BEGIN OPEN c_employee(100); LOOP FETCH c_employee INTO emp_name; EXIT WHEN c_employee%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || emp_name); END LOOP; CLOSE c_employee; END;