Курсоры Oracle: методы и примеры поиска данных

В Oracle курсоры используются для извлечения данных из базы данных и управления ими. Они предоставляют механизм для перебора набора результатов и выполнения различных операций с данными. Вот несколько методов, обычно используемых с курсорами в Oracle, а также примеры кода:

  1. Неявные курсоры:

    • Неявные курсоры автоматически создаются 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;
  2. Явные курсоры:

    • Явные курсоры — это определяемые пользователем курсоры, которые обеспечивают больший контроль над обработкой набора результатов.
    • Пример:
      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;
  3. Атрибуты курсора:

    • Атрибуты курсора предоставляют информацию о состоянии курсора.
    • Пример:
      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;
  4. Курсор цикла 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;
  5. Параметры курсора:

    • Параметры курсоров позволяют передавать значения курсорам, что делает их более гибкими.
    • Пример:
      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;