Oracle Cursor游标
Oracle游标 是指向私有 SQL 区域的指针,该区域存储有关 SELECT 或 DML 语句(如 INSERT、UPDATE、DELETE 或 MERGE)处理的信息。
游标是一种机制,可帮助您为 SELECT 语句指定名称并操作该 SQL 语句中的信息。
一、Oracle 如何声明游标
语法:
CURSOR cursor_name
IS
SELECT_statement;
让我们看看如何定义一个名为 c1 的游标。我们正在使用包含“course_id”和“course_name”列的表名“course”。
示例:
CURSOR c1
IS
SELECT course_id
FROM courses
WHERE course_name = name_in;
在上面的示例中,该游标的结果集是所有 course_id,其 course_name 与名为 name_in 的变量匹配。
二、Oracle 如何在函数中使用光标
语法:
CREATE OR REPLACE Function FindCourse
( name_in IN varchar2 )
RETURN number
IS
cnumber number;
CURSOR c1
IS
SELECT course_id
FROM courses
WHERE course_name = name_in;
BEGIN
OPEN c1;
FETCH c1 INTO cnumber;
if c1%notfound then
cnumber := 9999;
end if;
CLOSE c1;
RETURN cnumber;
END;
输出结果为:
Function created.
0.09 seconds
三、Oracle 如何打开游标
游标声明后,必须使用 open 语句打开游标。
语法:
OPEN cursor_name;
示例:
OPEN c1;
四、Oracle 如何在函数中使用打开光标
此函数指定如何使用 open 语句。
示例:
CREATE OR REPLACE Function FindCourse
( name_in IN varchar2 )
RETURN number
IS
cnumber number;
CURSOR c1
IS
SELECT course_id
FROM courses
WHERE course_name = name_in;
BEGIN
OPEN c1;
FETCH c1 INTO cnumber;
if c1%notfound then
cnumber := 9999;
end if;
CLOSE c1;
RETURN cnumber;
END;
输出结果为:
Function created.
0.09 seconds
五、如何从游标中获取行
此语句在声明并打开游标后使用。它用于从游标中获取行。
语法:
FETCH cursor_name INTO variable_list;
参数说明:
- cursor_name:它指定您希望获取行的游标的名称。
- variable_list:它指定您希望存储游标结果集的变量列表。
示例:
定义一个游标:
CURSOR c1
IS
SELECT course_id
FROM courses
WHERE course_name = name_in;
获取数据:
FETCH c1 into cnumber;
让我们举个例子,将 course_id 获取到名为 cnumber 的变量中。
CREATE OR REPLACE Function FindCourse
( name_in IN varchar2 )
RETURN number
IS
cnumber number;
CURSOR c1
IS
SELECT course_id
FROM courses
WHERE course_name = name_in;
BEGIN
OPEN c1;
FETCH c1 INTO cnumber;
if c1%notfound then
cnumber := 9999;
end if;
CLOSE c1;
RETURN cnumber;
END;
六、如何关闭光标
CLOSE 语句是最后一步,它用于在您完成使用游标后关闭游标。
语法:
CLOSE cursor_name;
关闭游标的语句:
CLOSE c1;
示例:
CREATE OR REPLACE Function FindCourse
( name_in IN varchar2 )
RETURN number
IS
cnumber number;
CURSOR c1
IS
SELECT course_id
FROM courses
WHERE course_name = name_in;
BEGIN
OPEN c1;
FETCH c1 INTO cnumber;
if c1%notfound then
cnumber := 9999;
end if;
CLOSE c1;
RETURN cnumber;
END;
七、光标内的光标
也可以在游标中声明游标。以下示例指定如何在游标中声明游标。
在此示例中,有一个名为 get_tables 的游标检索所有者和 table_name 值。然后将这些值用于名为 get_columns 的第二个游标中。
示例:
CREATE OR REPLACE PROCEDURE MULTIPLE_CURSORS_PROC is
v_owner varchar2(40);
v_table_name varchar2(40);
v_column_name varchar2(100);
/* First cursor */
CURSOR get_tables IS
SELECT DISTINCT tbl.owner, tbl.table_name
FROM all_tables tbl
WHERE tbl.owner = 'SYSTEM';
/* Second cursor */
CURSOR get_columns IS
SELECT DISTINCT col.column_name
FROM all_tab_columns col
WHERE col.owner = v_owner
AND col.table_name = v_table_name;
BEGIN
-- Open first cursor
OPEN get_tables;
LOOP
FETCH get_tables INTO v_owner, v_table_name;
-- Open second cursor
OPEN get_columns;
LOOP
FETCH get_columns INTO v_column_name;
END LOOP;
CLOSE get_columns;
END LOOP;
CLOSE get_tables;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end MULTIPLE_CURSORS_PROC;
输出结果为:
Procedure created.
0.16 seconds
注意:每次从第一个游标检索新记录时,您必须不断打开和关闭第二个游标。这样,第二个游标将使用第一个游标的新变量值。
热门文章
优秀文章