1. 程式人生 > >ORACLE遊標的使用

ORACLE遊標的使用

1、遊標的說明:遊標是一種向包含多條資料記錄的結果集中每次讀取一行的機制,逐行處理查詢結果,以程式設計的方式訪問資料庫。可以把遊標當成指標,可以指定結果集中的任何位置,然後允許使用者對指定位置的資料進行操作。SQL的遊標是一種臨時資料庫物件,可以臨時存放資料表中的資料行副本,也可以指向儲存在資料表中資料行指標。

2、遊標的種類及使用

(1)隱式遊標:在PLSQL程式中執行DML SQL語句(insert、update、delete、select...into...)時自動建立隱式遊標,自動開啟和關閉,名字固定叫sql。隱式遊標是靜態遊標

可以通過隱式遊標的屬性來了解操作的狀態和結果,進而控制程式的流程;sql遊標名只能訪問前一個DML操作的遊標屬性,所以在DML操作完成後立即使用sql遊標名來訪問遊標屬性

隱式遊標屬性:%notfound:SQL語句影響一行或多行資料時為ture

                       %found:SQL語句沒有影響任何行時為ture

                       %rowcount:返回SQL語句影響的行數

                      %isopen:判斷遊標是否開啟,隱式遊標的該屬性一直是flase,因為隱式遊標在執行DML SQL語句時開啟,執行結束後關閉

例:begin
  --insert into test(code,name) values ('aa','張三');
  update test set code='bb';
  dbms_output.put_line('遊標影響的行數'||sql%rowcount);
  if sql%notfound then
    dbms_output.put_line('notfound為真');
    else
    dbms_output.put_line('notfound為假');
  end if;
  if sql%found then
    dbms_output.put_line('found為真');
    else
    dbms_output.put_line('found為假');
  end if;
  if sql%isopen then
    dbms_output.put_line('isopen為真');
    else
    dbms_output.put_line('isopen為假');
  end if;
  commit;
end;

(2)顯式遊標:用於處理返回多行的查詢

無參遊標語法:cursor <遊標名> is select語句; --宣告遊標
            open <遊標名>; --開啟遊標
            fetch <遊標名> into <用於儲存資料的變數名>; --移動遊標並獲取資料
            close <遊標名>; --關閉遊標
例1:無參遊標,loop迴圈
declare
    cursor cur is select code,name from test; --宣告遊標cur     
    temp cur%rowtype; --宣告一個遊標變數,通配遊標一行所有列資料型別      
    begin
        execute immediate 'truncate table test_01';
        open cur;--開啟遊標
        loop
        fetch cur into temp;--將遊標所在行的資料轉存到temp中
        exit when cur%notfound;--當遊標到最後一行時退出
        insert into test_01(code,name)
            values(temp.code,temp.name);
        end loop;
        commit;
        close cur;--關閉遊標
     end;
例2:無參遊標,while迴圈
declare
    cursor cur is select code,name from test; --宣告遊標
    m1 varchar2(20); --宣告變數
    m2 varchar2(20);
      
    begin
        execute immediate 'truncate table test_01';
        open cur;--開啟遊標
        fetch cur into m1,m2;--將第一行資料轉存到m1,m2中!!! 
        while cur%found --判斷是否有資料
        loop    
          insert into test_01(code,name) values(m1,m2);
          fetch cur into m1,m2;--將下一行的資料轉存到m1,m2中!!!
        end loop;
        commit;
        close cur;--關閉遊標
     end;
例3:無參遊標,for迴圈
declare
    cursor cur is select code,name from test;  --宣告變數     
    begin
        execute immediate 'truncate table test_01';
        for temp in cur --使用for...in...可以省略開啟和關閉遊標的操作
        loop    
          insert into test_01(code,name) values(temp.code,temp.name);
        end loop;
        commit;
     end;

通配型別操作符:
%rowtype:通配一行所有列資料型別

%type:通配某行某列資料型別

遊標屬性:(遊標屬性必須在關閉遊標之前)
%isopen:判斷遊標是否開啟
%isfound:找不到資料時
%found:找到資料時
%rowcount:返回當前遊標已掃描的資料行數量

(3)動態遊標:ref遊標也叫動態遊標,ref遊標和遊標變數用於處理動態執行的SQL查詢

語法:type <ref遊標型別名> is ref cursor;--宣告ref遊標型別
      <遊標名> <ref遊標型別名>;--宣告ref遊標變數
     open 遊標名 for select語句;--開啟遊標
     fetch <遊標名> into <用於儲存資料的變數名>;--移動遊標並獲取資料
     close <遊標名>;--關閉遊標
例:
declare
    type cur is ref cursor;--宣告ref遊標型別
    cur1 cur;--宣告ref遊標變數
    m1 varchar2(30); --宣告變數,用於存放遊標中取出的資料(注:動態遊標不能使用%type或%rowtype來作為存放遊標取出資料的變數的型別)
    m2 varchar2(30);
    begin
    execute immediate 'truncate table test_01';--動態sql
    open cur1 for select code,name from test; --開啟遊標
    loop
    fetch cur1 into m1,m2;--移動遊標並獲取資料,將資料儲存在m1、m2中
    exit when cur1%notfound;
      insert into test_01(code,name) values(m1,m2);
    end loop;
    commit;
    close cur1;
    end;

3、迴圈語句:遊標通常搭配迴圈語句使用

a、loop迴圈語法:
    loop
	exit when 表示式;
	執行語句;
    end loop;
b、while迴圈語法:
    while 表示式;
    loop
	執行語句;
    end loop;
c、for迴圈語法:
    for <變數> in <變數取值範圍(小值...大值 如:1...100)>
    loop
	執行語句;
    end loop;



相關推薦

Oracle遊標

begin 隱式 open put 定義 delete declare ora update 遊標分顯示遊標跟隱式遊標,它們都具有%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT四個屬性。 %FOUND:如果SQL語句至少影響到一行數據,則該屬性為tr

oracle遊標的使用(二)

copy str 創建 data- sel 字段 開封 tex 歷史 逐行處理查詢結果,以編程的方式訪問數據 遊標的類型: 1、隱式遊標:在 PL/SQL 程序中執行DML SQL 語句時自動創建隱式遊標,名字固定叫sql。 2、顯式遊標:顯式遊標用於處理返回多行的

mysql和Oracle 遊標的使用

mysql和oracle 遊標的使用使用遊標根據一個表中的數據,循環創建不同的表mysql中的DELIMITER $$DROP PROCEDURE IF EXISTS zy.jk_jkzl_political_location_pro $$CREATE PROCEDURE zy.jk_jkzl_politi

[轉載]Oracle 遊標使用全解

case sys too 結果 nvarchar 指定 信息 ima ren 這個文檔幾乎包含了oracle遊標使用的方方面面,全部通過了測試 -- 聲明遊標;CURSOR cursor_name IS select_statement--For 循環遊標--(1)定義

Oracle遊標/異常/過程/函數

bst body enter erro 備註 iso 位移 回調 log 1、基礎語法 http://692088846.iteye.com/blog/2017137 (%type、%rowtype、if\if else\if elseif else、while、do

oracle 遊標

fetch turn pen otf select set not 弱類型 單行 1.自定義(顯式)遊標 set serverout on;declare cursor cu_emp is select empno,ename,sal from emp;e_no numbe

Oracle遊標 CURSOR實例詳解

www 取值 alt 內存 sel www. 輸出 lose info 作者:gqk 遊標 CURSOR: 一、遊標概述: 遊標(cursor)是數據庫系統在內存中開設的一個數據緩沖區,存放SQL語句的執行結果。 每個遊標都有一個名字,用戶可以用SQL語句逐一從遊標中

Oracle 遊標的各種寫法

-- for .. in `隱式遊標` BEGIN FOR RS IN (SELECT column_1 FROM table_name) LOOP dbms_output.put_line(RS.column_1); END LOOP; END; -- RS 必須是單個欄位 DECLARE

Oracle 遊標實現學生學號自動生成

每個學生都有唯一專屬的學號,現有學號格式為ABCDEFGHIJ共10位數字,其中AB表示學院編號;CD表示專業編號;EF表示年級;GH表示班級編號;IJ表示學生序號。 已知:2018年開學之際,已知每個專業的總人數和需要分配的班級數,請為每位同學分配唯一的學號。 要求:每個專業的班級序號

oracle遊標一 靜態遊標-顯示遊標-宣告&初始化

oracle靜態遊標-顯示遊標的使用 目錄: 1. 遊標語法 2. 遊標的使用 2.1 宣告遊標並初始化 2.2 宣告多個變數接收遊標返回值 2.3 宣告一個record變數接收遊標返回值 2.4 開啟/關閉遊標 2.5 獲取遊標中的值 2.6 重複

Oracle-遊標迴圈插入資料

遇到一個需求統計歷史每個月底的資料插入到表中,查詢了資料發現使用遊標會很方便,記錄一下解決思路 先查出每個月月底的日期作為條件 select to_char(lastday, 'yyyy-mm-dd') lastday from (select last

Oracle 遊標遍歷 顯式遊標 靜態遊標 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

-- Created on 2018/11/6 by YXQ  --顯示遊標 & 靜態遊標的處理 declare      --定義(遊標一個可以遍歷的結果集)      --宣告cursor,建立和命名一個sql工作

Oracle使用遊標更新資料 Oracle遊標之select for update和where current of 語句

Oracle使用遊標更新資料 2016年11月20日 13:15:49 hzwy23 閱讀數:5313 友情推廣 ###使用遊標修改資料 ####定義一個遊標,遊標名稱為 mycursor #####更新scott使用者中emp表中empno

ORACLE遊標學習

方式一: set serverout on; //這裡定義的遊標cu_emp可以理解為一個數組一樣的東西 declare cursor cu_emp is select empno,ename,sal from emp; e_no number; e_name varchar2(10);

oracle 遊標迴圈刪除表資料 sql

    declare   cursor table_user is     select table_name      from user_tables     where table_name not like 'resthome';    table_name va

Oracle遊標的使用示例

此文是使用Oracle遊標的幾種方式,for...in會自動開啟遊標,fetch...into需要手動開啟遊標,遊標類似於一個只會往前移動的指標,每次指向資料集中的一行資料,通過遊標可以開啟資料集,也能用於遍歷資料集中的資料,在儲存過程中可以實現loop迴圈,以及一些比較複雜的邏輯,也可以用於在儲存過程中返回

oracle遊標處理多行記錄

1.查詢工資大於10號部門平均工資的職工資訊 declare cursor cc is select * from emp where sal>(select avg(sal) from emp where deptno=10); ccrec cc%rowtype;

ORACLE遊標的使用

1、遊標的說明:遊標是一種向包含多條資料記錄的結果集中每次讀取一行的機制,逐行處理查詢結果,以程式設計的方式訪問資料庫。可以把遊標當成指標,可以指定結果集中的任何位置,然後允許使用者對指定位置的資料進行操作。SQL的遊標是一種臨時資料庫物件,可以臨時存放資料表中的資料行副本,

oracle 遊標,函式 function , 儲存過程 PROCEDURE , 觸發器 Trigger

1、 ORACLE函式定義 function uf_execute_sql(as_where varchar2, as_sql varchar2) return varchar2 is v_ret varchar2(30); begin execute immediate as_sql into v_ret

Oracle遊標的使用例項

遊標就是移動的游標,可以用來逐條或批量的處理資料。當遊標移動到某行時,即可對該行資料進行操作,如提取資料等。 遊標有一下四個屬性,即這四個屬性僅可被用於遊標上:%isopen判斷遊標是否被開啟,值為true或false;%found和%notfound判斷遊標所在行是否有效