鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ PL/SQL游標(biāo)
PL/SQL記錄
PL/SQL基本語(yǔ)法
PL/SQL集合
PL/SQL包
PL/SQL關(guān)系運(yùn)算符
PL/SQL比較運(yùn)算符
PL/SQL條件控制
PL/SQL字符串
PL/SQL算術(shù)運(yùn)算符
PL/SQL變量
PL/SQL IF-THEN-ELSIF語(yǔ)句
PL/SQL函數(shù)
PL/SQL異常
PL/SQL FOR循環(huán)語(yǔ)句
PL/SQL日期及時(shí)間
PL/SQL EXIT語(yǔ)句
PL/SQL DBMS輸出
PL/SQL過(guò)程
PL/SQL CONTINUE語(yǔ)句
PL/SQL數(shù)組
PL/SQL嵌套IF-THEN-ELSE語(yǔ)句
PL/SQL事務(wù)
PL/SQL CASE語(yǔ)句
PL/SQL IF-THEN語(yǔ)句
PL/SQL GOTO語(yǔ)句
PL/SQL運(yùn)算符優(yōu)先級(jí)
PL/SQL觸發(fā)器
PL/SQL運(yùn)算符
PL/SQL教程
PL/SQL WHILE循環(huán)語(yǔ)句
PL/SQL面向?qū)ο?/span>
PL/SQL循環(huán)
PL/SQL邏輯運(yùn)算符
PL/SQL IF-THEN-ELSE語(yǔ)句
PL/SQL數(shù)據(jù)類型
PL/SQL環(huán)境安裝設(shè)置
PL/SQL游標(biāo)
PL/SQL基本循環(huán)語(yǔ)句
PL/SQL搜索CASE語(yǔ)句
PL/SQL常量和文字
PL/SQL嵌套循環(huán)

PL/SQL游標(biāo)

Oracle會(huì)創(chuàng)建一個(gè)存儲(chǔ)區(qū)域,被稱為上下文區(qū)域,用于處理SQL語(yǔ)句,其中包含需要處理的語(yǔ)句,例如所有的信息,行數(shù)處理,等等。

游標(biāo)是指向這一上下文的區(qū)域。 PL/SQL通過(guò)控制光標(biāo)在上下文區(qū)域。游標(biāo)持有的行(一個(gè)或多個(gè))由SQL語(yǔ)句返回。行集合光標(biāo)保持的被稱為活動(dòng)集合。

可以命名一個(gè)光標(biāo),它可以在程序中獲取和處理SQL語(yǔ)句,一次返回的行引用。有兩種類型的游標(biāo):

  • 隱式游標(biāo)

  • 顯式游標(biāo)

隱式游標(biāo)

Oracle在一個(gè)SQL語(yǔ)句的執(zhí)行,當(dāng)沒(méi)有顯式游標(biāo)的語(yǔ)句隱式游標(biāo)時(shí)自動(dòng)創(chuàng)建。程序員無(wú)法控制隱式游標(biāo)其中的信息。

每當(dāng)發(fā)出一個(gè)DML語(yǔ)句(INSERT,UPDATE和DELETE),隱式游標(biāo)與此語(yǔ)句關(guān)聯(lián)。對(duì)于INSERT操作時(shí),光標(biāo)保持一個(gè)需要插入的數(shù)據(jù)。對(duì)于UPDATE和DELETE操作,光標(biāo)標(biāo)識(shí)會(huì)受到影響的行。

在PL/SQL,可以參考最近的隱式游標(biāo)的SQL游標(biāo),它有類似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT屬性。在SQL游標(biāo)有額外的屬性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,設(shè)計(jì)用于所有語(yǔ)句中使用。下表提供了最常用的屬性的描述:

屬性 描述
%FOUND 返回TRUE如果一個(gè)INSERT,UPDATE或DELETE語(yǔ)句影響了一行或多行或SELECT INTO語(yǔ)句返回一行或多行。否則,它將返回FALSE。
%NOTFOUND 邏輯相反%FOUND。返回TRUE如果一個(gè)INSERT,UPDATE或DELETE語(yǔ)句影響沒(méi)有行或SELECT INTO語(yǔ)句返回任何行。否則,它將返回FALSE。
%ISOPEN 隱式游標(biāo)總是返回FALSE,因?yàn)镺racle執(zhí)行其相關(guān)的SQL語(yǔ)句之后自動(dòng)關(guān)閉SQL游標(biāo)。
%ROWCOUNT 返回受INSERT,UPDATE影響的行數(shù),或DELETE語(yǔ)句,或者通過(guò)一個(gè)SELECT INTO語(yǔ)句返回。

任何SQL游標(biāo)屬性將被訪問(wèn),SQL%attribute_name如示例圖所示。

例子:

這里使用我們已經(jīng)創(chuàng)建,并在前面的章節(jié)中使用的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 |
+----+----------+-----+-----------+----------+

下面的程序?qū)⒏卤?,并通過(guò)每個(gè)客戶的薪水增加500和使用SQL%ROWCOUNT屬性來(lái)確定受影響的行數(shù):

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;
/

當(dāng)上述代碼在SQL提示符執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

6 customers selected

PL/SQL procedure successfully completed.

如果查看customers表中的記錄,會(huì)發(fā)現(xiàn)各行已更新:

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 |
+----+----------+-----+-----------+----------+

顯式游標(biāo)

顯式游標(biāo)是程序員定義游標(biāo)獲得更多的控制權(quán)的上下文的區(qū)域。顯式游標(biāo)應(yīng)在PL/SQL塊的聲明部分中定義。這是創(chuàng)建一個(gè)SELECT語(yǔ)句返回多行。

創(chuàng)建顯式游標(biāo)語(yǔ)法是:

CURSOR cursor_name IS select_statement;

使用顯式游標(biāo)的工作包括四個(gè)步驟:

  • 聲明游標(biāo)用于初始化在存儲(chǔ)器

  • 打開(kāi)游標(biāo)分配內(nèi)存

  • 獲取游標(biāo)檢索數(shù)據(jù)

  • 關(guān)閉游標(biāo)釋放分配的內(nèi)存

聲明游標(biāo)

聲明游標(biāo)定義游標(biāo)的名稱和相關(guān)的SELECT語(yǔ)句。例如:

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

打開(kāi)游標(biāo)

打開(kāi)游標(biāo)游標(biāo)分配內(nèi)存,使得它準(zhǔn)備取的SQL語(yǔ)句轉(zhuǎn)換成它

上一篇:PL/SQL數(shù)組下一篇:PL/SQL記錄