在Oracle中,游标(Cursor)用于从数据库表中检索数据。游标可以是显式的,也可以是隐式的。显式游标由用户定义,允许用户更精确地控制数据检索过程。
以下是在Oracle存储过程中声明游标的基本格式:
1. 显式游标
显式游标允许你定义从数据库中检索哪些数据,以及如何检索。
DECLARE
CURSOR cursor_name IS SELECT column1, column2, ... FROM table_name WHERE condition;
v_column1 table_name.column1%TYPE;
v_column2 table_name.column2%TYPE;
...
BEGIN
OPEN cursor_name;
LOOP
FETCH cursor_name INTO v_column1, v_column2, ...;
EXIT WHEN cursor_name%NOTFOUND;
-- 处理检索到的数据
DBMS_OUTPUT.PUT_LINE(v_column1 || ' ' || v_column2);
END LOOP;
CLOSE cursor_name;
END;
• DECLARE:开始声明部分。
• CURSOR cursor_name IS:声明一个游标,cursor_name是游标的名字。
• SELECT column1, column2, ... FROM table_name WHERE condition:定义游标要执行的查询。
• v_column1 table_name.column1%TYPE:声明变量来存储从游标检索的数据。
• BEGIN:开始执行部分。
• OPEN cursor_name:打开游标。
• LOOP:开始循环,用于逐行检索数据。
• FETCH cursor_name INTO v_column1, v_column2, ...;:从游标中检索数据,并将其存储到变量中。
• EXIT WHEN cursor_name%NOTFOUND;:如果游标没有更多的数据,则退出循环。
• DBMS_OUTPUT.PUT_LINE:输出检索到的数据。
• CLOSE cursor_name:关闭游标。
• END;:结束存储过程。
2. 使用游标 FOR LOOP
Oracle还提供了一种更简洁的方式来使用游标,即游标 FOR LOOP,它自动打开、获取和关闭游标。
DECLARE
v_column1 table_name.column1%TYPE;
v_column2 table_name.column2%TYPE;
BEGIN
FOR rec IN (SELECT column1, column2 FROM table_name WHERE condition)
LOOP
v_column1 := rec.column1;
v_column2 := rec.column2;
-- 处理检索到的数据
DBMS_OUTPUT.PUT_LINE(v_column1 || ' ' || v_column2);
END LOOP;
END;
• FOR rec IN (SELECT column1, column2 FROM table_name WHERE condition):声明一个游标 FOR LOOP,rec是记录的名字,它代表查询结果的当前行。
• LOOP:开始循环,用于逐行检索数据。
• v_column1 := rec.column1;:将检索到的数据赋值给变量。
• DBMS_OUTPUT.PUT_LINE:输出检索到的数据。
3. REF CURSOR
REF CURSOR是一种特殊的游标,它允许将结果集作为一个对象传递给存储过程或函数。
CREATE OR REPLACE PROCEDURE get_employees (p_dept_id IN employees.department_id%TYPE, p_cursor OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_cursor FOR SELECT employee_id, first_name, last_name FROM employees WHERE department_id = p_dept_id;
END;
• CREATE OR REPLACE PROCEDURE get_employees:创建存储过程。
• p_cursor OUT SYS_REFCURSOR:定义一个输出参数,类型为SYS_REFCURSOR,用于传递游标。
• OPEN p_cursor FOR:打开游标并将查询结果集赋值给输出参数。
调用这个存储过程:
DECLARE
v_cursor SYS_REFCURSOR;
BEGIN
get_employees(10, v_cursor);
LOOP
FETCH v_cursor INTO v_employee_id, v_first_name, v_last_name;
EXIT WHEN v_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_employee_id || ' ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE v_cursor;
END;
• v_cursor SYS_REFCURSOR:声明一个变量来接收输出的游标。
• FETCH v_cursor INTO:从游标中检索数据。
这些是Oracle存储过程中游标的常见使用方式。