在本章中,我们将讨论PL/SQL中的游标. Oracle创建了一个内存区域,称为上下文区域,用于处理SQL语句,该语句包含处理语句所需的所有信息;例如,处理的行数等.
游标是指向此上下文区域的指针. PL/SQL通过游标控制上下文区域.游标保存SQL语句返回的行(一个或多个).游标所持有的行集称为活动集.
您可以命名游标,以便在程序中引用它来获取并处理SQL语句返回的行,一次一个.有两种类型的游标和减号;
隐式游标
显式游标
每当执行SQL语句时,当没有明确的游标时,Oracle会自动创建隐式游标.声明.程序员无法控制隐式游标及其中的信息.
每当发出DML语句(INSERT,UPDATE和DELETE)时,隐式游标都与此语句相关联.对于INSERT操作,游标保存需要插入的数据.对于UPDATE和DELETE操作,游标标识将受影响的行.
在PL/SQL中,您可以将最新的隐式游标称为 SQL游标,它总是具有%FOUND,%ISOPEN,%NOTFOUND 和%ROWCOUNT 等属性. SQL游标具有其他属性,%BULK_ROWCOUNT 和%BULK_EXCEPTIONS ,旨在与 FORALL 语句一起使用.下表提供了最常用属性的描述 :
S.No | 属性&描述 |
---|---|
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.
如果您检查customers表中的记录,您会发现行已更新并减去;
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;
以下是一个完整的示例,用于说明显式游标和minua的概念;
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程序成功完成.