游标使用说明
Oracle中,游標是操作數據最常用,也是最有效的方法.
?根據Oracle游標的聲明方法不同,可以將Oracle的游標分為顯式和隱式兩種.
?顯式游標就是有明確聲明的游標,顯式游標的操作主要有如下幾類:
?
?第一,游標的聲明:
??聲明游標時,要用關鍵字 CURSOR ,
??如 CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??其中,CURSOR, IS 為關鍵字, CUR_SAMPLE 為游標名稱,后面的 SELECT 語句是與游標關聯的查詢語句.這幾部分不能少.
??
?第二,參數傳遞:
??在聲明游標時,不僅可以使用上面的方法:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??同時,也可以給游標傳遞參數,
??CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24)) IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
??給游標傳遞的參數可以是多個,也可以是不同的類型.但是參數只能傳入,不能傳出.
??在指定參數的同時,可以同時設定默認值.
??如: CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24) DEFAULT 'EMPLOYEES') IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
??
?第三,聲明游標變量
??用下面的方法聲明一個游標:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??但在使用游標時,必段要聲明游標變量或其它變量,存放從游標中取出的數據:
??游標變量類型可以有兩種:
??
??(1) 定義游標類型的變量:
???C_SMAPLE CUR_SAMPLE%ROWTYPE;
??(2)
???聲明一個變量列表:
???M_TNAME???? VARCHAR2(30);
???M_TABTYPE?? VARCHAR2(7);
???M_CLUSTERID NUMBER(5);
????
?第四,打開游標
??在操作數據之前,首先要打開游標:
??先聲明一個游標:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??然后再打開:
??OPEN CUR_SAMPLE;
??對于有參數的游標,在打開時,需要同時傳遞參數:
??如游標聲明如下:
??CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24) DEFAULT 'EMPLOYEES') IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
??打開方法如下:
??OPEN CUR_SAMPLE('EMPLOYEES');
??但時,如果參數有默認值,并且想使用默認值,可以直接:
??OPEN CUR_SAMPLE;
??此時,PAR_TABLENAME值等于'EMPLOYEES',也就是相當于
??OPEN CUR_SAMPLE('EMPLOYEES');
????
??但是如果打開一個已經打開的游標,會報錯:
??ORA-06511:PL/SQL:cursor already open;
??
??OPEN 一個游標時,游標的指針自動的指向活動集的第一條記錄.
??
?第五,讀取游標數據:
??讀取數據之前,游標一定要先打開:
??需要傳遞參數的,用參數打開,不需要參數的,可以直接打開.
??
??讀取數據也就是用 FETCH 方法把數據讀取到變量中.
??對于游標類型的變量,可以用下面的方法: (游標參數的定義請看第三)
??FETCH CUR_SAMPLE INTO C_SAMPLE;
??也可以
??FETCH CUR_SMALE INTO M_TNAME,M_TABTYPE,M_CLUSTERID;
??使用變量列表時,變量列表的順序一定要和游標活動結果集中的字段順序相同.
??
??如果用游標類型的變量時,用以下的方法訪問其中的值:
??C_SMAPLE.TNAME,C_SAMPLE.TABTYPE,C_SAMPLE.CLUSTERID;
??對于用變量列表的方法,直接使用變量名稱就可以了.
??
??執行 FETCH 一次,游標指針自動的移到下一條記錄.
??
?第六,關閉游標:
??關閉游標最簡單,直接
??CLOSE 游標名; 就可以了.
??如對游標:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??就可以:
??CLOSE CUR_SAMPLE;
??游標是否有參數,關閉方法相同.
??
?使用游標可以極大方便PL/SQL的編寫,但游標也比較特殊,如游標數據只能用FETCH來讀取,游標指針的移動在FETCH數據時,自動的移到下一條,游標打開時,游標指針自動的指向第一條記錄,另外,游標是用靜態的方法打開的,也就是游標打開后,如果相關表執行DML(DELETE, INSERT, UPDATE)操作,其操作結果是不能反映到游標中來的,只能先關閉游標,再打開游標,才可以更新游標活動集的數據.? 例如:declare
?? v_ab?? air.a%type;
?? v_dname integer(10);
?? cursor v_cur is select a,b from air;
?begin
?? open v_cur;
?? loop
??????? fetch v_cur into v_ab,v_dname;
??????? exit when v_cur%notfound;
??????? dbms_output.put_line('a'||v_ab||',b'||v_dname);
?? end loop;
??????? dbms_output.put_line('total count'||v_cur%rowcount);
?end;
?根據Oracle游標的聲明方法不同,可以將Oracle的游標分為顯式和隱式兩種.
?顯式游標就是有明確聲明的游標,顯式游標的操作主要有如下幾類:
?
?第一,游標的聲明:
??聲明游標時,要用關鍵字 CURSOR ,
??如 CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??其中,CURSOR, IS 為關鍵字, CUR_SAMPLE 為游標名稱,后面的 SELECT 語句是與游標關聯的查詢語句.這幾部分不能少.
??
?第二,參數傳遞:
??在聲明游標時,不僅可以使用上面的方法:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??同時,也可以給游標傳遞參數,
??CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24)) IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
??給游標傳遞的參數可以是多個,也可以是不同的類型.但是參數只能傳入,不能傳出.
??在指定參數的同時,可以同時設定默認值.
??如: CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24) DEFAULT 'EMPLOYEES') IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
??
?第三,聲明游標變量
??用下面的方法聲明一個游標:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??但在使用游標時,必段要聲明游標變量或其它變量,存放從游標中取出的數據:
??游標變量類型可以有兩種:
??
??(1) 定義游標類型的變量:
???C_SMAPLE CUR_SAMPLE%ROWTYPE;
??(2)
???聲明一個變量列表:
???M_TNAME???? VARCHAR2(30);
???M_TABTYPE?? VARCHAR2(7);
???M_CLUSTERID NUMBER(5);
????
?第四,打開游標
??在操作數據之前,首先要打開游標:
??先聲明一個游標:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??然后再打開:
??OPEN CUR_SAMPLE;
??對于有參數的游標,在打開時,需要同時傳遞參數:
??如游標聲明如下:
??CURSOR CUR_SAMPLE(PAR_TABLENAME VARCHAR2(24) DEFAULT 'EMPLOYEES') IS SELECT * FROM TAB WHERE TNAME = PAR_TABLENAME;
??打開方法如下:
??OPEN CUR_SAMPLE('EMPLOYEES');
??但時,如果參數有默認值,并且想使用默認值,可以直接:
??OPEN CUR_SAMPLE;
??此時,PAR_TABLENAME值等于'EMPLOYEES',也就是相當于
??OPEN CUR_SAMPLE('EMPLOYEES');
????
??但是如果打開一個已經打開的游標,會報錯:
??ORA-06511:PL/SQL:cursor already open;
??
??OPEN 一個游標時,游標的指針自動的指向活動集的第一條記錄.
??
?第五,讀取游標數據:
??讀取數據之前,游標一定要先打開:
??需要傳遞參數的,用參數打開,不需要參數的,可以直接打開.
??
??讀取數據也就是用 FETCH 方法把數據讀取到變量中.
??對于游標類型的變量,可以用下面的方法: (游標參數的定義請看第三)
??FETCH CUR_SAMPLE INTO C_SAMPLE;
??也可以
??FETCH CUR_SMALE INTO M_TNAME,M_TABTYPE,M_CLUSTERID;
??使用變量列表時,變量列表的順序一定要和游標活動結果集中的字段順序相同.
??
??如果用游標類型的變量時,用以下的方法訪問其中的值:
??C_SMAPLE.TNAME,C_SAMPLE.TABTYPE,C_SAMPLE.CLUSTERID;
??對于用變量列表的方法,直接使用變量名稱就可以了.
??
??執行 FETCH 一次,游標指針自動的移到下一條記錄.
??
?第六,關閉游標:
??關閉游標最簡單,直接
??CLOSE 游標名; 就可以了.
??如對游標:
??CURSOR CUR_SAMPLE IS SELECT * FROM TAB;
??就可以:
??CLOSE CUR_SAMPLE;
??游標是否有參數,關閉方法相同.
??
?使用游標可以極大方便PL/SQL的編寫,但游標也比較特殊,如游標數據只能用FETCH來讀取,游標指針的移動在FETCH數據時,自動的移到下一條,游標打開時,游標指針自動的指向第一條記錄,另外,游標是用靜態的方法打開的,也就是游標打開后,如果相關表執行DML(DELETE, INSERT, UPDATE)操作,其操作結果是不能反映到游標中來的,只能先關閉游標,再打開游標,才可以更新游標活動集的數據.? 例如:declare
?? v_ab?? air.a%type;
?? v_dname integer(10);
?? cursor v_cur is select a,b from air;
?begin
?? open v_cur;
?? loop
??????? fetch v_cur into v_ab,v_dname;
??????? exit when v_cur%notfound;
??????? dbms_output.put_line('a'||v_ab||',b'||v_dname);
?? end loop;
??????? dbms_output.put_line('total count'||v_cur%rowcount);
?end;
轉載于:https://blog.51cto.com/airlgc/26387
總結
- 上一篇: 网络专业人士笔记
- 下一篇: 第四章课后习题及答案