首页 > 数据库 >无涯教程-PL/SQL - 游标(Cursors)

无涯教程-PL/SQL - 游标(Cursors)

时间:2023-12-22 19:32:00浏览次数:36  
标签:语句 customers name 游标 无涯 Cursors SQL 隐式

在本章中,无涯教程将讨论PL/SQL中的游标,Oracle创建一个内存区域,称为上下文区域,用于处理SQL语句,其中包含处理该语句所需的所有信息。

您可以命名游标,以便可以在程序中引用该游标以一次获取和处理SQL语句返回的行,游标有两种类型-

  • Implicit 隐式游标
  • Explicit 显式游标

隐式游标

当执行SQL语句时,当没有隐式游标时,Oracle会自动创建隐式游标,程序员无法控制隐式游标及其中的信息。

每当发出DML语句(INSERT,UPDATE和DELETE)时,隐式游标都会与此语句关联,对于INSERT操作,光标保存需要插入的数据,对于UPDATE和DELETE操作,游标标识将受到影响的行。

在PL/SQL中,您可以将最新的隐式游标称为 SQL游标,该游标始终具有诸如%FOUND,%ISOPEN,%NOTFOUND 和%ROWCOUNT 。 SQL游标具有其他属性,%BULK_ROWCOUNT 和%BULK_EXCEPTIONS ,旨在与 FORALL 语句一起使用。下表提供了最常用的属性的描述-

S.No Attribute & 描述
1

%FOUND

如果INSERT,UPDATE或DELETE语句影响一行或多行,或者SELECT INTO语句返回一行或多行,则返回TRUE。否则,它返回FALSE。

2

%NOTFOUND

%FOUND的逻辑相反。如果INSERT,UPDATE或DELETE语句不影响任何行,或者SELECT INTO语句不返回任何行,则返回TRUE。否则,它返回FALSE。

3

%ISOPEN

始终对隐式游标返回FALSE,因为Oracle在执行其关联的SQL语句后会自动关闭SQL游标。

4

%ROWCOUNT

返回受INSERT,UPDATE或DELETE语句影响或受SELECT INTO语句返回的行数。

如下示例所示,任何SQL游标属性都将以 sql%attribute_name 的形式访问。

无涯教程将使用之前各章中创建和使用的CUSTOMERS表。

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

以下程序将更新表并将每个客户的薪水增加500,并使用 SQL%ROWCOUNT 属性确定受影响的行数-

DECLARE  
   total_rows number(2); 
BEGIN 
   UPDATE customers 
   SET salary = salary + 500; 
   IF sql%notfound THEN 
      dbms_output.put_line('no customers selected'); 
   ELSIF sql%found THEN 
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers selected '); 
   END IF;  
END; 
/

当以上代码在SQL提示符下执行时,将产生以下输出-

6 customers selected  

PL/SQL procedure successfully completed. 

如果您查看客户表中的记录,您会发现行已更新-

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 
|  2 | Khilan   |  25 | Delhi     |  2000.00 | 
|  3 | kaushik  |  23 | Kota      |  2500.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 
|  6 | Komal    |  22 | MP        |  5000.00 | 
+----+----------+-----+-----------+----------+

显式游标

显式游标是程序员定义的游标,用于获得对上下文区域的更多控制,应该在PL/SQL块的声明部分中定义一个显式游标。它是在SELECT语句上创建的,该语句返回多个行。

创建显式游标的语法是-

CURSOR cursor_name IS select_statement; 

使用显式游标包括以下步骤-

  • 声明游标 - 用于初始化内存的游标
  • 打开游标 - 以分配内存
  • 获取游标 - 以获取数据
  • 关闭游标 - 以释放分配的内存

声明游标

声明游标会使用名称和关联的SELECT语句定义游标。如-

CURSOR c_customers IS 
   SELECT id, name, address FROM customers; 

打开游标

打开游标会为游标分配内存,并使其准备好将SQL语句返回的行提取到其中。如,无涯教程将打开以下定义的游标,如下所示:

OPEN c_customers; 

获取游标

提取游标涉及一次访问一行。如,无涯教程将从上面打开的游标中获取行,如下所示:

FETCH c_customers INTO c_id, c_name, c_addr; 

关闭游标

关闭游标意味着释放分配的内存。如,无涯教程将关闭上面打开的游标,如下所示:

CLOSE c_customers;

游标示例

DECLARE 
   c_id customers.id%type; 
   c_name customerS.No.ame%type; 
   c_addr customers.address%type; 
   CURSOR c_customers is 
      SELECT id, name, address FROM customers; 
BEGIN 
   OPEN c_customers; 
   LOOP 
   FETCH c_customers into c_id, c_name, c_addr; 
      EXIT WHEN c_customers%notfound; 
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 
   END LOOP; 
   CLOSE c_customers; 
END; 
/

当以上代码在SQL提示符下执行时,将产生以下输出-

1 Ramesh Ahmedabad  
2 Khilan Delhi  
3 kaushik Kota     
4 Chaitali Mumbai  
5 Hardik Bhopal   
6 Komal MP  
  
PL/SQL procedure successfully completed. 

参考链接

https://www.learnfk.com/plsql/plsql-cursors.html

标签:语句,customers,name,游标,无涯,Cursors,SQL,隐式
From: https://blog.51cto.com/u_14033984/8937845

相关文章

  • 无涯教程-PL/SQL - 函数(Functions)
    在本章中,无涯教程将讨论PL/SQL中的函数,函数与过程相同,只不过它返回一个值,因此,上一章的所有讨论也适用于函数。创建函数使用CREATEFUNCTION语句创建一个函数。CREATEORREPLACEPROCEDURE语句的简化语法如下-CREATE[ORREPLACE]FUNCTIONfunction_name[(parameter_n......
  • 游标循环中定义变量
    在游标循环中定义变量,与外面定义变量有何不同,如下代码所示:CREATETABLE#temp(NAMEVARCHAR(50));INSERTINTO#tempVALUES('1');INSERTINTO#tempVALUES('2');DECLARE@iINT=1;DECLARE@djbhVARCHAR(50);DECLAREA_CRCURSORFORWARD_ONLYFORSELECTNAMEFR......
  • 无涯教程-PL/SQL - 存储过程(Procedures)
    在模式级别,存储过程是独立子程序,它是使用CREATEPROCEDURE或CREATEFUNCTION语句创建的,它存储在数据库中,可以使用DROPPROCEDURE或DROPFUNCTION语句删除。PL/SQL子程序被称为PL/SQL块,可以使用一组参数来调用它们。PL/SQL提供两种子程序-Functions  -这些函数返回单个值,主......
  • 无涯教程-PL/SQL - 运算符
    在本章中,无涯教程将讨论PL/SQL中的运算符,PL/SQL语言具有丰富的内置运算符,并提供以下类型的运算符-算术运算符关系运算符比较运算符逻辑运算符在这里,无涯教程将一一理解算术,关系,比较和逻辑运算符。算术运算符下表显示了PL/SQL支持的所有算术运算符。假设变量A=10,而变量B=......
  • 无涯教程-PL/SQL - 变量声明
    在本章中,无涯教程将讨论Pl/SQL中的变量,变量不过是无涯教程程序可以操作的存储区域的名称。变量声明PL/SQL变量必须在声明部分或程序包中声明为全局变量,声明变量时,PL/SQL为变量的值分配内存,并且存储位置由变量名标识。variable_name[CONSTANT]datatype[NOTNULL][:=|DEFA......
  • 无涯教程-PL/SQL - 环境设置
    在本章中,无涯教程将讨论PL/SQL的环境设置,PL/SQL不是独立的编程语言,它是Oracle编程环境中的工具,SQL*Plus是一个交互式工具,可让您在命令提示符下键入SQL和PL/SQL语句,然后将这些命令发送到数据库进行处理,处理完语句后,输出将发送回并显示在屏幕上。要运行PL/SQL程序,您应该在计......
  • 无涯教程-PL/SQL - 简介
    PL/SQL(ProceduralLanguage/SQL)是甲骨文公司专有的SQL扩展语言,应用在甲骨文公司的Oracle数据库系统。一些的SQL数据库管理系统也提供了类似的扩展SQL语言。PL/SQL的的语法非常类似于Ada,而且像1980年代的Ada编译器一样,PL/SQL的运作系统使用Diana作为中介语言。重要的是PL/SQL紧密......
  • 无涯教程-Haskell - Nested if-else 语句函数
    以下代码显示了如何在Haskell中使用嵌套的if-else语句-main=doletvar=26ifvar==0thenputStrLn"Numberiszero"elseifvar`rem`2==0thenputStrLn"NumberisEven"elseputStrLn"NumberisOdd"在上面的示例中......
  • 无涯教程-Haskell - Monads
    Monads只是一种带有某些附加函数的ApplicativeFunctor,它是一个Type类,它管理称为monadic规则的三个基本规则。所有这三个规则严格适用于Monad声明,如下所示-classMonadmwherereturn::a->ma(>>=)::ma->(a->mb)->mb(>>)::ma->mb->mb......
  • 无涯教程-Haskell - 输入&输出
    到目前为止,我们讨论的所有示例本质上都是静态的,在本章中,我们将学习与用户动态交流,我们将学习Haskell中使用的不同输入和输出技术。文件和流到目前为止,我们已经对程序本身中的所有输入进行了硬编码,我们一直在从静态变量获取输入,现在,让我们学习如何从外部文件读取和写入。让我们......