PLSQL 游标和引用数据类型

本文详细介绍了PL/SQL中的游标概念,包括隐式游标和显式游标。隐式游标主要用于单行查询结果的处理,而显式游标适用于多行数据的迭代。通过示例展示了如何使用%TYPE和%ROWTYPE引用数据类型,并演示了显式游标的声明、打开、获取数据和关闭四个步骤。此外,还提供了使用FOR循环简化游标操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标的类型有两种:隐式游标和显式游标

说明:当进行表的数据查询操作, 一般用游标实现,
查询结果为单行的可以用隐式游标select … into …,
查询结果为多行的可以用显式游标cursor …;

1.隐式游标

(单行值写入变量可以用select … into …)

对变量赋值还可以使用SELECT…INTO 语句从数据库中查询数据对变量进行赋值。
**查询的结果只能是一行记录,不能是零行或者多行记录。**

打印出emp中员工编号为7369的姓名和工资。 
DECLARE
  V_ENAME VARCHAR2(10);
  V_SAL NUMBER(7,2);
BEGIN
  SELECT ENAME,SAL
	INTO V_ENAME,V_SAL          -- 隐士游标赋值(来源于表的查询结果,查询结果只能是单行)
	FROM EMP WHERE EMPNO=7369;
  DBMS_OUTPUT.PUT_LINE('员工名称:'||V_ENAME||' 员工工资:'||V_SAL);    -- 不能直接打印表,只能是单行字段拼接后的字符串形式打印
END;

2.引用数据类型

%TYPE:   引用表中的某列的数据类型或某个变量的数据类型(单值变量,只能存储单值)。
%ROWTYPE:引用表中的一行(所有字段)作为数据类型(表变量,也只能一行一行的存储)。

	打印出emp中员工编号为7369的姓名和工资。
--%TYPE 引用表单个字段类型
DECLARE
  v_name emp.ename%TYPE;      -- 引用表的单个字段类型(单值变量)
  v_sal  emp.sal%TYPE;
BEGIN
  SELECT ename, sal
	INTO v_name, v_sal
	FROM emp 
   WHERE empno=7369;
  dbms_output.put_line('姓名:' || v_name ||' 工资: ' ||v_sal);
END;
-- %ROWTYPE 引用表的所有字段类型
	DECLARE
	  v_emp emp%ROWTYPE;         -- 引用整个表的字段类型(表变量)
	BEGIN
	  SELECT *
		INTO v_emp               -- 插入整行数据(所有字段数据)
		FROM emp 
	   WHERE empno=7369;
	  dbms_output.put_line('姓名:' || v_emp.ename ||' 工资: ' ||v_emp.sal);  -- 不能直接打印整个表,只能是单个值的拼接
	END;

3.显式游标

(多行值写入变量用显式游标)
游标的类型有两种:隐式游标和显式游标。
PL/SQL会为所有的SQL数据操作声明一个隐式的游标,包括只返回一条记录的查询操作。
显式游标四个步骤:
1.声明
2.打开游标
3.逐行获取数据
4.关闭游标

语法结构:声明游标
CURSOR 游标名[(参数1 数据类型[,参数2 数据类型...])]
IS SELECT 语句;  --游标的声明
  
语法结构:执行游标
OPEN 游标名[(实际参数1[,实际参数2...])];  --打开游标
FETCH 游标名 INTO 变量名1[,变量名2...];FETCH 游标名 INTO 记录变量;  --提取数据
CLOSE 游标名;  --关闭游标

FOR循环(比较方便)

DECLARE
  CURSOR C_EMP IS
  SELECT ENAME,SAL FROM EMP
  	WHERE DEPTNO=10; 
BEGIN
 FOR V_EMP IN C_EMP LOOP
	DBMS_OUTPUT.PUT_LINE('姓名: ' || V_EMP.ENAME || '工资: ' || V_EMP.SAL);
 END LOOP;
END;

需要游标参数

	DECLARE
	  CURSOR C_EMP(P_DEPTNO EMP.DEPTNO%TYPE) IS   -- 游标参数
	  SELECT ENAME,SAL
		FROM EMP 
	   WHERE DEPTNO=P_DEPTNO;
	BEGIN
	  FOR V_EMP IN C_EMP(&部门号) LOOP    -- 键盘输入变量值(键盘输入值时,字符型要加单引号)/打开游标的时候传入
	  DBMS_OUTPUT.PUT_LINE('姓名: ' || V_EMP.ENAME || '工资: ' || V_EMP.SAL);
	  END LOOP;
	END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值