PL/SQL

PL/SQL 知识量:16 - 57 - 244

11.2 游标><

什么是游标- 11.2.1 -

游标是一种用于处理查询结果集的数据结构,它允许程序开发人员按照自己的需要逐行处理查询结果。游标提供了一种机制,可以将查询结果集中的每一行数据作为一个单独的数据元素进行处理,而不是一次性将整个结果集加载到内存中。

游标的作用主要包括以下几个方面:

  • 逐行处理查询结果:游标允许程序开发人员逐行处理查询结果集,可以按照自己的需要对每一行数据进行处理,例如进行数据的显示、存储、修改等操作。

  • 控制结果集的访问:游标提供了一种机制,可以控制对查询结果集的访问,例如可以控制只访问结果集中的某些行,或者按照特定的顺序访问行。

  • 允许对查询结果进行多次操作:游标可以将查询结果集存储在内存中,并允许程序开发人员对其进行多次操作,例如可以多次遍历结果集,或者对结果集中的数据进行排序、过滤等操作。

在PL/SQL中,游标可以分为以下几类:

  • 隐式游标:隐式游标是PL/SQL中自动创建的游标,用于处理DML语句(如INSERT、UPDATE、DELETE等)的结果集。隐式游标不需要程序开发人员显式声明和打开,PL/SQL会自动处理。

  • 显式游标:显式游标需要程序开发人员显式声明和打开,用于处理查询语句(如SELECT)的结果集。显式游标可以分为静态游标和动态游标两种类型。静态游标在编译时检查语法错误,动态游标在运行时检查语法错误。

  • 引用游标:引用游标是指向已经声明的游标的引用,可以通过引用游标来访问已经声明的游标。引用游标的作用是在程序的不同部分使用同一个游标,避免重复声明和打开游标。

  • 系统游标:系统游标是PL/SQL预定义的游标,用于访问系统表和一些特殊的查询结果集。系统游标不需要程序开发人员显式声明和打开,可以直接使用。

显式游标的定义和操作- 11.2.2 -

显式游标是需要程序开发人员显式声明和操作的游标。显式游标可以分为静态游标和动态游标两种类型。静态游标是指在编译时检查语法错误的游标,而动态游标是指在运行时检查语法错误的游标。

下面是显式游标的定义和操作的示例代码:

-- 声明游标  
DECLARE  
  CURSOR c_emp IS  
    SELECT empno, ename, sal FROM emp WHERE deptno = 10;  
  
  -- 声明变量用于存储查询结果  
  v_empno   emp.empno%TYPE;  
  v_ename   emp.ename%TYPE;  
  v_sal     emp.sal%TYPE;  
BEGIN  
  -- 打开游标  
  OPEN c_emp;  
  
  -- 循环遍历查询结果集  
  LOOP  
    -- 从游标中获取一行数据  
    FETCH c_emp INTO v_empno, v_ename, v_sal;  
  
    -- 退出循环如果没有更多数据可供获取  
    EXIT WHEN c_emp%NOTFOUND;  
  
    -- 处理数据,例如输出到控制台  
    DBMS_OUTPUT.PUT_LINE('Emp No: ' || v_empno || ', Name: ' || v_ename || ', 
    Salary: ' || v_sal);  
  END LOOP;  
  
  -- 关闭游标  
  CLOSE c_emp;  
END;

上述代码中,首先声明了一个名为c_emp的游标,该游标从emp表中选择deptno为10的员工的empno、ename和sal字段。然后声明了三个变量用于存储查询结果。在BEGIN和END之间的代码块中,首先打开游标,然后使用LOOP循环遍历查询结果集,使用FETCH语句从游标中获取一行数据并将其存储到变量中。如果没有更多数据可供获取,则退出循环。在循环中,可以对数据进行处理,例如输出到控制台。最后关闭游标。

显式游标的属性- 11.2.3 -

在PL/SQL中,显式游标具有一些属性,这些属性提供了有关游标状态的信息。以下是显式游标的一些常见属性:

  • %ISOPEN:此属性返回一个布尔值,指示游标是否已打开。如果游标已打开,则返回TRUE;否则返回FALSE。

  • %FOUND:此属性返回一个布尔值,指示游标是否指向有效的行。如果游标指向有效行,则返回TRUE;否则返回FALSE。

  • %NOTFOUND:此属性与%FOUND属性相反,返回一个布尔值,指示游标是否不指向有效的行。如果游标不指向有效行,则返回TRUE;否则返回FALSE。

  • %ROWCOUNT:此属性返回一个整数值,指示从游标开始位置起已经获取的行数。

  • %EOF:此属性返回一个布尔值,指示是否已经到达结果集的末尾。如果已经到达末尾,则返回TRUE;否则返回FALSE。

  • %BOF:此属性返回一个布尔值,指示是否已经到达结果集的开头。如果已经到达开头,则返回TRUE;否则返回FALSE。

这些属性可以在程序中使用,以便根据需要控制游标的操作。例如,可以使用%ISOPEN属性检查游标是否已打开,使用%FOUND属性检查游标是否指向有效行等。

隐式游标- 11.2.4 -

隐式游标是自动创建的游标,用于处理数据操作语言(DML)语句,如INSERT、UPDATE和DELETE等。隐式游标不需要程序开发人员显式声明和打开,PL/SQL会自动处理。

隐式游标的属性与显式游标类似,包括%ISOPEN、%FOUND、%NOTFOUND、%ROWCOUNT、%EOF和%BOF等。

在使用隐式游标时,需要注意以下几点:

  • 隐式游标在DML语句执行后立即关闭,因此无法对其进行显式控制操作,如CLOSE或FETCH等。

  • 隐式游标的属性可以用于检测DML语句的执行结果。例如,可以使用%FOUND属性检查INSERT、UPDATE或DELETE语句是否影响了至少一行数据。

  • 隐式游标通常与异常处理一起使用。例如,在执行DML语句之前,可以使用SAVEPOINT语句创建一个保存点,以便在发生异常时回滚到该保存点。

下面是一个使用隐式游标的示例代码:

BEGIN  
  -- 插入一条记录  
  INSERT INTO employees (employee_id, first_name, last_name) VALUES (1001, 'John', 'Doe');  
  
  -- 检查插入操作是否成功  
  IF SQL%FOUND THEN  
    DBMS_OUTPUT.PUT_LINE('Insert successful');  
  ELSE  
    DBMS_OUTPUT.PUT_LINE('Insert failed');  
  END IF;  
END;

在上述示例中,执行了INSERT语句后,使用SQL%FOUND属性检查插入操作是否成功。如果插入成功,则输出"Insert successful";否则输出"Insert failed"。