一、概念
Cursor(游标)用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。
它的结果集相当于Oralce中的一个视图。
二、用途和描述
Cursor(游标)主要用在Oracle的Pl/Sql的程序里面,如:存储过程、函数等。它做为一个变量类型出现。
Orale的Cursor(游标)分为两种类型:
1.静态游标:
分为显式游标和隐式游标。
2.REF游标:
是一种引用类型,类似于指针。
三、结构与构成
(一)显示Cursor:
1、构成方式
CURSOR 游标名(参数) [返回值类型] IS {Select语句}
参数部分可以为空
如定义游标C_R可以使用以下方式:
CURSOR C_R IS SELECT A,B FROM TABLE_NAME;
2、生命周期
a.打开游标(OPEN)
解析,绑定。。。不会从数据库检索数据
b.从游标中获取记录(FETCH INTO)
执行查询,返回结果集。通常定义局域变量作为从游标获取数据的缓冲区。
c.关闭游标(CLOSE)
3、实例
CREATE OR REPLACE PROCEDURE P_W_CURSOR AS
CURSOR C_TAB IS
SELECT SJB FROM T_TABLE;
CURSOR C_FIELD(V_TABLE VARCHAR2) IS
SELECT DECODE(DATA_TYPE, 'VARCHAR2', 'Y', 'N') LX, COLUMN_NAME
FROM ALL_TAB_COLUMNS A
WHERE TABLE_NAME = V_TABLE
ORDER BY COLUMN_ID;
V_FIE VARCHAR2(30000);
V_SQL VARCHAR2(32000);
BEGIN
FOR C_T IN C_TAB LOOP
V_SQL := 'CREATE OR REPLACE V_' || C_T.SJB || ' AS ' || CHR(13);
FOR C_F IN C_FIELD(C_T.SJB) LOOP
V_FIE := C_F.COLUMN_NAME;
IF C_F.LX = 'Y' THEN
IF V_FIE IS NULL THEN
V_FIE := ' HEXTORAW(UTL_RAW.CASE_TO_RAW(' || C_F.COLUMN_NAME || '))';
ELSE
V_FIE := V_FIE || ', HEXTORAW(UTL_RAW.CASE_TO_RAW(' ||
C_F.COLUMN_NAME || '))';
END IF;
ELSE
IF V_FIE IS NULL THEN
V_FIE := C_F.COLUMN_NAME;
ELSE
V_FIE := V_FIE || ', ' || C_F.COLUMN_NAME;
END IF;
END IF;
END LOOP;
V_SQL := V_SQL || V_FIE || CHR(13) || ' FROM ' || C_T.SJB;
EXECUTE IMMEDIATE V_SQL; --创建视图
END LOOP;
END;
4、实例说明:
这是一个创建实力的存储过程,即把T_TABLE表里的SJB字段的表名创建成对应视图。这里是通过两个CURSOR实现的(即C_TAB和C_FIELD,一个带有参数,另外一个没有。请注意参数的使用方法)。
上述实例也可以使用Loop循环,写法上只是稍有不同。