欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何看oracle游標(biāo) oracle 游標(biāo) for

Oracle數(shù)據(jù)庫(kù)游標(biāo)的類型

游標(biāo)是SQL的一個(gè)內(nèi)存工作區(qū) 由系統(tǒng)或用戶以變量的形式定義 游標(biāo)的作用就是用于臨時(shí)存儲(chǔ)從數(shù)據(jù)庫(kù)中提取的數(shù)據(jù)塊

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元延壽做網(wǎng)站,已為上家服務(wù),為延壽各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

Oracle數(shù)據(jù)庫(kù)的Cursor類型包含三種 靜態(tài)游標(biāo) 分為顯式(explicit)游標(biāo)和隱式(implicit)游標(biāo) REF游標(biāo) 是一種引用類型 類似于指針

測(cè)試數(shù)據(jù)

create table student(sno number primary key sname varchar ( ))

declare i number:= ;

beginwhile i=

loop

insert into student(sno sname) values (i name ||to_char(i))

i:=i+ ;

end loop;

end;

隱式游標(biāo)屬性

SQL%ROWCOUNT 整型代表DML語(yǔ)句成功執(zhí)行的數(shù)據(jù)行數(shù)

SQL%FOUND 布爾型值為TRUE代表插入 刪除 更新或單行查詢操作成功

SQL%NOTFOUND 布爾型與SQL%FOUND屬性返回值相反

SQL%ISOPEN 布爾型DML執(zhí)行過程中為真 結(jié)束后為假

declarebegin? update student set sname = name ||to_char(sno* ) where sname= name ;

if sql%found then

dbms_output put_line( name is updated )

else

dbms_output put_line( 沒有記錄 )

end if;

end;

declare

begin

for names in (select * from student) loop

dbms_output put_line(names sname)

end loop;

exception when others then

dbms_output put_line(sqlerrm)

end;

顯式游標(biāo)屬性

%ROWCOUNT 獲得FETCH語(yǔ)句返回的數(shù)據(jù)行數(shù)

%FOUND 最近的FETCH語(yǔ)句返回一行數(shù)據(jù)則為真 否則為假

%NOTFOUND 布爾型 與%FOUND屬性返回值相反

%ISOPEN 布爾型 游標(biāo)已經(jīng)打開時(shí)值為真 否則為假

對(duì)于顯式游標(biāo)的運(yùn)用分為四個(gè)步驟

a 定義游標(biāo) Cursor [Cursor Name] IS;

b 打開游標(biāo) Open [Cursor Name];

c 操作數(shù)據(jù) Fetch [Cursor name];

d 關(guān)閉游標(biāo) Close [Cursor Name];

典型顯式游標(biāo)

declare cursor cur_rs is select * from student; sinfo student%rowtype;

begin? open cur_rs;

loop

fetch cur_rs into sinfo;

exit when cur_rs%%notfound;

dbms_output put_line(sinfo sname)

end loop;

exception when others then

dbms_output put_line(sqlerrm)

end;

帶參數(shù)open的顯式cursor:

declare cursor cur_rs(in_name varchar ) is select *

from student where sname=in_name;

begin? for sinfo in cur_rs( sname ) loop

dbms_output put_line(sinfo sname)

end loop;

exception when others then

dbms_output put_line(sqlerrm)

end;

使用current of語(yǔ)句執(zhí)行update或delete操作

declare

cursor cur_rs is select * from student for update;

begin? for sinfo in cur_rs loop

update student set sname=sname|| xx where current of cur_rs;

end loop;

mit;

exception when others then

dbms_output put_line(sqlerrm)

end;

REF游標(biāo) 用于處理運(yùn)行時(shí)才能確定的動(dòng)態(tài)sql查詢結(jié)果 利用REF CURSOR 可以在程序間傳遞結(jié)果集(一個(gè)程序里打開游標(biāo)變量 在另外的程序里處理數(shù)據(jù))

也可以利用REF CURSOR實(shí)現(xiàn)BULK SQL 提高SQL性能

REF CURSOR分兩種 Strong REF CURSOR 和 Weak REF CURSOR

Strong REF CURSOR: 指定retrun type CURSOR變量的類型必須和return type一致

Weak REF CURSOR: 不指定return type 能和任何類型的CURSOR變量匹配

運(yùn)行時(shí)根據(jù)動(dòng)態(tài)sql查詢結(jié)果遍歷

create or replace package pkg_test as

type student_refcursor_type is ref cursor return student%rowtype;

procedure student_rs_loop(cur_rs IN student_refcursor_type)

end pkg_test ;

create or replace package body pkg_test as

procedure student_rs_loop(cur_rs IN student_refcursor_type) is

std student%rowtype;

begin? loop

fetch cur_rs into std;

exit when cur_rs%NOTFOUND;

dbms_output put_line(std sname)

end loop;

end student_rs_loop;

end pkg_test ;

declare stdRefCur pkg_test student_refcursor_type;

begin? for i in loop

dbms_output put_line( Student NO= || i)

open stdRefCur for select * from student where sno=i;

pkg_test student_rs_loop(stdRefCur)

end loop;

exception when others then dbms_output put_line(sqlerrm)

close stdRefCur;

end;

使用FORALL和BULK COLLECT子句 利用BULK SQL可以減少PLSQL Engine和SQL Engine之間的通信開銷 提高性能

加速INSERT UPDATE DELETE語(yǔ)句的執(zhí)行 也就是用FORALL語(yǔ)句來替代循環(huán)語(yǔ)句

加速SELECT 用BULK COLLECT INTO 來替代INTO

create table

student_tmp as select sno

sname from student where = ;

刪除主鍵約束 alter table student drop constraint SYS_C ;

執(zhí)行兩遍插入 insert into student select * from student where sno= ;

declare cursor cur_std(stdid student sno%type) is select sno

sname from student where sno=stdid;

type student_table_type is table of cur_std%rowtype index by pls_integer;

student_table student_table_type;

begin

open cur_std( )

fetch cur_std bulk collect into student_table;

close cur_std;

for i in unt loop

dbms_output put_line(student_table(i) sno ||

|| student_table(i) sname)

end loop;

forall i in student_table firststudent_table last

insert into student_tmp values(student_table(i) sno student_table(i) sname)

mit;

end;

lishixinzhi/Article/program/Oracle/201311/17358

Oracle游標(biāo)使用總結(jié)

Oracle游標(biāo)分為顯示游標(biāo)和隱式游標(biāo)

顯示游標(biāo)(Explicit Cursor):在PL/SQL程序中定義的 用于查詢的游標(biāo)稱作顯示游標(biāo)

隱式游標(biāo)(Implicit Cursor):是指非PL/SQL程序中定義的 而且是在PL/SQL中使用UPDATE/DELETE語(yǔ)句時(shí) Oracle系統(tǒng)自動(dòng)分配的游標(biāo)

一 顯示游標(biāo)

使用步驟

( )定義 ( )打開 ( )使用 ( )關(guān)閉

使用演示

首先創(chuàng)建測(cè)試用表STUDENT 腳本如下

( ) 使用WHILE循環(huán)處理游標(biāo)

create or replace PROCEDURE PROC_STU AS

BEGIN

顯示游標(biāo)使用 使用while循環(huán)

declare

定義游標(biāo) 名稱為cur_stu

cursor cur_stu is

select stuno stuname from student order by stuno;

定義變量 存放游標(biāo)取出的數(shù)據(jù)

v_stuno varchar( );

v_stuname varchar( );

begin

打開游標(biāo)cur_stu

open cur_stu;

將游標(biāo)的當(dāng)前行取出存放到變量中

fetch cur_stu into v_stuno v_stuname;

while cur_stu%found 游標(biāo)所指還有數(shù)據(jù)行 則繼續(xù)循環(huán)

loop

打印結(jié)果

dbms_output PUT_LINE(v_stuno|| ||v_stuname);

繼續(xù)將游標(biāo)所指的當(dāng)前行取出放到變量中

fetch cur_stu into v_stuno v_stuname;

end loop;

close cur_stu; 關(guān)閉游標(biāo)

end;

END PROC_STU ;

( ) 使用IF ELSE代替WHILE循環(huán)處理游標(biāo)

create or replace PROCEDURE PROC_STU AS

BEGIN

顯示游標(biāo)使用 使用if判斷

declare

定義游標(biāo) 名稱為cur_stu

cursor cur_stu is

select stuno stuname from student order by stuno;

定義變量 存放游標(biāo)取出的數(shù)據(jù)

v_stuno varchar( );

v_stuname varchar( );

begin

打開游標(biāo)cur_stu

open cur_stu;

將游標(biāo)的當(dāng)前行取出存放到變量中

fetch cur_stu into v_stuno v_stuname;

loop

if cur_stu%found then 如果游標(biāo)cur_stu所指還有數(shù)據(jù)行

打印結(jié)果

dbms_output PUT_LINE(v_stuno|| ||v_stuname);

繼續(xù)將游標(biāo)所指的當(dāng)前行取出放到變量中

fetch cur_stu into v_stuno v_stuname;

else

exit;

end if;

end loop;

close cur_stu; 關(guān)閉游標(biāo)

end;

END PROC_STU ;

( ) 使用FOR循環(huán)處理游標(biāo)

create or replace PROCEDURE PROC_STU AS

BEGIN

顯示游標(biāo)使用 使用for循環(huán)

declare

定義游標(biāo) 名稱為cur_stu

cursor cur_stu is

select stuno stuname from student order by stuno;

begin

for stu in cur_stu

loop

dbms_output PUT_LINE(stu stuno|| ||stu stuname);

循環(huán)做隱含檢查 %notfound

end loop;

自動(dòng)關(guān)閉游標(biāo)

end;

END PROC_STU ;

( ) 常用的使用EXIT WHEN處理游標(biāo)

create or replace

PROCEDURE PROC_STU _ AS

BEGIN

顯示游標(biāo)使用 使用exit when循環(huán)

declare

定義游標(biāo) 名稱為cur_stu

cursor cur_stu is

select stuno stuname from student order by stuno;

定義變量 存放游標(biāo)取出的數(shù)據(jù)

v_stuno varchar( );

v_stuname varchar( );

begin

打開游標(biāo)cur_stu

open cur_stu;

loop

將游標(biāo)的當(dāng)前行取出存放到變量中

fetch cur_stu into v_stuno v_stuname;

exit when cur_stu%notfound; 游標(biāo)所指還有數(shù)據(jù)行 則繼續(xù)循環(huán)

打印結(jié)果

dbms_output PUT_LINE(v_stuno|| ||v_stuname);

end loop;

close cur_stu; 關(guān)閉游標(biāo)

end;

END PROC_STU _ ;

二 隱式游標(biāo)

使用演示

create or replace PROCEDURE PROC_STU AS

BEGIN

隱式游標(biāo)使用

update student set stuname= 張燕廣 where stuno= ;

如果更新沒有匹配則插入一條新記錄

if SQL%NOTFOUND then

insert into student(STUNO STUNAME AGE GENDER)

values( 張燕廣 男 );

end if;

END PROC_STU ;

說明

所有的SQL語(yǔ)句在上下文區(qū)內(nèi)部都是可執(zhí)行的 因?yàn)槎加幸粋€(gè)游標(biāo)指向上下文區(qū) 此游標(biāo)就是

SQL游標(biāo) 與現(xiàn)實(shí)游標(biāo)不同的是 SQL游標(biāo)在PL/SQL中不需要打開和關(guān)閉 而是在執(zhí)行UPDATE

DELETE是自動(dòng)打開和關(guān)閉

上面例子中就是通過SQL%NOTFOUND游標(biāo)屬性判斷UPDATE語(yǔ)句的執(zhí)行結(jié)果決定是否需要插入新記錄 CREATE TABLE STUDENT (

STUNAME VARCHAR ( BYTE)

STUNO VARCHAR ( BYTE)

AGE NUMBER

GENDER VARCHAR ( CHAR)

lishixinzhi/Article/program/Oracle/201311/17531

oracle存儲(chǔ)過程中打開游標(biāo)有幾種方法?用open直接打開?

聲明游標(biāo)時(shí)寫好SELECT語(yǔ)句,如

CURSOR r_cur1 IS select *** from tableName where 條件;

使用時(shí)

OPEN r_cur1;

LOOP

FETCH *** INTO variable;

EXIT WHEN r_cur1%NOTFOUND OR r_cur1%NOTFOUND IS NULL;

甲骨文股份有限公司(NASDAQ:ORCL,Oracle)是全球大型數(shù)據(jù)庫(kù)軟件公司。總部位于美國(guó)加州紅木城的紅木岸(Redwood Shores),現(xiàn)時(shí)首席執(zhí)行官為公司創(chuàng)辦人勞倫斯·埃里森(Lawrence J. Ellison)。

如何用Oracle查看與修改最大游標(biāo)數(shù)

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

連接到:

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.1.0 - Production

SQL show parameter open_cursors;

NAME TYPE VALUE

------------------------------------ ----------- -------------------

open_cursors integer 3002、查看當(dāng)前打開的游標(biāo)數(shù)目

SQL select count(*) from v$open_cursor;

COUNT(*)

----------174943、修改Oracle最大游標(biāo)數(shù)

SQL alter system set open_cursors=1000 scope=both;

系統(tǒng)已更改。

快速掌握Oracle數(shù)據(jù)庫(kù)游標(biāo)的使用方法

顯式游標(biāo)

當(dāng)查詢返回結(jié)果超過一行時(shí) 就需要一個(gè)顯式游標(biāo) 此時(shí)用戶不能使用select into語(yǔ)句 PL/SQL管理隱式游標(biāo) 當(dāng)查詢開始時(shí)隱式游標(biāo)打開 查詢結(jié)束時(shí)隱式游標(biāo)自動(dòng)關(guān)閉 顯式游標(biāo)在PL/SQL塊的聲明部分聲明 在執(zhí)行部分或異常處理部分打開 取出數(shù)據(jù) 關(guān)閉

使用游標(biāo)

這里要做一個(gè)聲明 我們所說的游標(biāo)通常是指顯式游標(biāo) 因此從現(xiàn)在起沒有特別指明的情況 我們所說的游標(biāo)都是指顯式游標(biāo) 要在程序中使用游標(biāo) 必須首先聲明游標(biāo)

聲明游標(biāo)

語(yǔ)法

CURSOR cursor_name IS select_statement;

在PL/SQL中游標(biāo)名是一個(gè)未聲明變量 不能給游標(biāo)名賦值或用于表達(dá)式中

DELCARE CURSOR C_EMP IS SELECT empno ename salary FROM emp WHERE salary ORDER BY ename; BEGIN

在游標(biāo)定義中SELECT語(yǔ)句中不一定非要表可以是視圖 也可以從多個(gè)表或視圖中選擇的列 甚至可以使用*來選擇所有的列

打開游標(biāo)

使用游標(biāo)中的值之前應(yīng)該首先打開游標(biāo) 打開游標(biāo)初始化查詢處理 打開游標(biāo)的語(yǔ)法是

OPEN cursor_name

cursor_name是在聲明部分定義的游標(biāo)名

OPEN C_EMP; 關(guān)閉游標(biāo)

語(yǔ)法

CLOSE cursor_name

CLOSE C_EMP; 從游標(biāo)提取數(shù)據(jù) 從游標(biāo)得到一行數(shù)據(jù)使用FETCH命令 每一次提取數(shù)據(jù)后 游標(biāo)都指向結(jié)果集的下一行 語(yǔ)法如下

FETCH cursor_name INTO variable[ variable ]

對(duì)于SELECT定義的游標(biāo)的每一列 FETCH變量列表都應(yīng)該有一個(gè)變量與之相對(duì)應(yīng) 變量的類型也要相同

SET SERVERIUTPUT ON DECLARE v_ename EMP ENAME%TYPE; v_salary EMP SALARY%TYPE; CURSOR c_emp IS SELECT ename salary FROM emp; BEGIN OPEN c_emp; FETCH c_emp INTO v_ename v_salary; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); FETCH c_emp INTO v_ename v_salary; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); FETCH c_emp INTO v_ename v_salary; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); CLOSE c_emp; END

這段代碼無(wú)疑是非常麻煩的 如果有多行返回結(jié)果 可以使用循環(huán)并用游標(biāo)屬性為結(jié)束循環(huán)的條件 以這種方式提取數(shù)據(jù) 程序的可讀性和簡(jiǎn)潔性都大為提高 下面我們使用循環(huán)重新寫上面的程序

SET SERVERIUTPUT ON DECLARE v_ename EMP ENAME%TYPE; v_salary EMP SALARY%TYPE; CURSOR c_emp IS SELECT ename salary FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_ename v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename || is || v_salary); END

記錄變量

定義一個(gè)記錄變量使用TYPE命令和%ROWTYPE 關(guān)于%ROWsTYPE的更多信息請(qǐng)參閱相關(guān)資料

記錄變量用于從游標(biāo)中提取數(shù)據(jù)行 當(dāng)游標(biāo)選擇很多列的時(shí)候 那么使用記錄比為每列聲明一個(gè)變量要方便得多

當(dāng)在表上使用%ROWTYPE并將從游標(biāo)中取出的值放入記錄中時(shí) 如果要選擇表中所有列 那么在SELECT子句中使用*比將所有列名列出來要得多

SET SERVERIUTPUT ON DECLARE R_emp EMP%ROWTYPE; CURSOR c_emp IS SELECT * FROM emp; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT PUT PUT_LINE( Salary of Employee ||r_emp ename|| is || r_emp salary); END LOOP; CLOSE c_emp; END;

%ROWTYPE也可以用游標(biāo)名來定義 這樣的話就必須要首先聲明游標(biāo)

SET SERVERIUTPUT ON DECLARE CURSOR c_emp IS SELECT ename salary FROM emp; R_emp c_emp%ROWTYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO r_emp; EXIT WHEN c_emp%NOTFOUND; DBMS_OUT PUT PUT_LINE( Salary of Employee ||r_emp ename|| is || r_emp salary); END LOOP; CLOSE c_emp; END;

帶參數(shù)的游標(biāo)

與存儲(chǔ)過程和函數(shù)相似 可以將參數(shù)傳遞給游標(biāo)并在查詢中使用 這對(duì)于處理在某種條件下打開游標(biāo)的情況非常有用 它的語(yǔ)法如下

CURSOR cursor_name[(parameter[ parameter] )] IS select_statement;

定義參數(shù)的語(yǔ)法如下

Parameter_name [IN] data_type[{:=|DEFAULT} value]

與存儲(chǔ)過程不同的是 游標(biāo)只能接受傳遞的值 而不能返回值 參數(shù)只定義數(shù)據(jù)類型 沒有大小

另外可以給參數(shù)設(shè)定一個(gè)缺省值 當(dāng)沒有參數(shù)值傳遞給游標(biāo)時(shí) 就使用缺省值 游標(biāo)中定義的參數(shù)只是一個(gè)占位符 在別處引用該參數(shù)不一定可靠

在打開游標(biāo)時(shí)給參數(shù)賦值 語(yǔ)法如下

OPEN cursor_name[value[ value] ];

參數(shù)值可以是文字或變量

DECALRE CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR ) IS SELECT ename salary FROM emp WHERE deptno=p_dept ORDER BY ename r_dept DEPT%ROWTYPE; v_ename EMP ENAME%TYPE; v_salary EMP SALARY%TYPE; v_tot_salary EMP SALARY%TYPE; BEGIN OPEN c_dept; LOOP FETCH c_dept INTO r_dept; EXIT WHEN c_dept%NOTFOUND; DBMS_OUTPUT PUT_LINE ( Department: || r_dept deptno|| ||r_dept dname); v_tot_salary:= ; OPEN c_emp(r_dept deptno); LOOP FETCH c_emp INTO v_ename v_salary; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT PUT_LINE ( Name: || v_ename|| salary: ||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; CLOSE c_emp; DBMS_OUTPUT PUT_LINE ( Toltal Salary for dept: || v_tot_salary); END LOOP; CLOSE c_dept; END;

游標(biāo)FOR循環(huán)

在大多數(shù)時(shí)候我們?cè)谠O(shè)計(jì)程序的時(shí)候都遵循下面的步驟

打開游標(biāo)

開始循環(huán)

從游標(biāo)中取值

那一行被返回

處理

關(guān)閉循環(huán)

關(guān)閉游標(biāo)

可以簡(jiǎn)單的把這一類代碼稱為游標(biāo)用于循環(huán) 但還有一種循環(huán)與這種類型不相同 這就是FOR循環(huán) 用于FOR循環(huán)的游標(biāo)按照正常的聲明方式聲明 它的優(yōu)點(diǎn)在于不需要顯式的打開 關(guān)閉 取數(shù)據(jù) 測(cè)試數(shù)據(jù)的存在 定義存放數(shù)據(jù)的變量等等 游標(biāo)FOR循環(huán)的語(yǔ)法如下

FOR record_name IN (corsor_name[(parameter[ parameter] )] | (query_difinition) LOOP statements END LOOP;

下面我們用for循環(huán)重寫上面的例子

DECALRE CURSOR c_dept IS SELECT deptno dname FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR ) IS SELECT ename salary FROM emp WHERE deptno=p_dept ORDER BY ename v_tot_salary EMP SALARY%TYPE; BEGIN FOR r_dept IN c_dept LOOP DBMS_OUTPUT PUT_LINE ( Department: || r_dept deptno|| ||r_dept dname); v_tot_salary:= ; FOR r_emp IN c_emp(r_dept deptno) LOOP DBMS_OUTPUT PUT_LINE ( Name: || v_ename || salary: || v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT PUT_LINE ( Toltal Salary for dept: || v_tot_salary); END LOOP; END;

在游標(biāo)FOR循環(huán)中使用查詢

在游標(biāo)FOR循環(huán)中可以定義查詢 由于沒有顯式聲明所以游標(biāo)沒有名字 記錄名通過游標(biāo)查詢來定義

DECALRE v_tot_salary EMP SALARY%TYPE; BEGIN FOR r_dept IN (SELECT deptno dname FROM dept ORDER BY deptno) LOOP DBMS_OUTPUT PUT_LINE( Department: || r_dept deptno|| ||r_dept dname); v_tot_salary:= ; FOR r_emp IN (SELECT ename salary  FROM emp  WHERE deptno=p_dept  ORDER BY ename) LOOP DBMS_OUTPUT PUT_LINE( Name: || v_ename|| salary: ||v_salary); v_tot_salary:=v_tot_salary+v_salary; END LOOP; DBMS_OUTPUT PUT_LINE( Toltal Salary for dept: || v_tot_salary); END LOOP; END;

游標(biāo)中的子查詢

語(yǔ)法如下

CURSOR C IS SELECT * FROM emp WHERE deptno NOT IN (SELECT deptno FROM dept WHERE dname!= ACCOUNTING );

可以看出與SQL中的子查詢沒有什么區(qū)別

游標(biāo)中的更新和刪除

在PL/SQL中依然可以使用UPDATE和DELETE語(yǔ)句更新或刪除數(shù)據(jù)行 顯式游標(biāo)只有在需要獲得多行數(shù)據(jù)的情況下使用 PL/SQL提供了僅僅使用游標(biāo)就可以執(zhí)行刪除或更新記錄的方法

UPDATE或DELETE語(yǔ)句中的WHERE CURRENT OF子串專門處理要執(zhí)行UPDATE或DELETE操作的表中取出的最近的數(shù)據(jù) 要使用這個(gè)方法 在聲明游標(biāo)時(shí)必須使用FOR UPDATE子串 當(dāng)對(duì)話使用FOR UPDATE子串打開一個(gè)游標(biāo)時(shí) 所有返回集中的數(shù)據(jù)行都將處于行級(jí)(ROW LEVEL)獨(dú)占式鎖定 其他對(duì)象只能查詢這些數(shù)據(jù)行 不能進(jìn)行UPDATE DELETE或SELECT FOR UPDATE操作

語(yǔ)法

FOR UPDATE [OF [schema ]lumn[ [schema ]lumn] [nowait]

在多表查詢中 使用OF子句來鎖定特定的表 如果忽略了OF子句 那么所有表中選擇的數(shù)據(jù)行都將被鎖定 如果這些數(shù)據(jù)行已經(jīng)被其他會(huì)話鎖定 那么正常情況下ORACLE將等待 直到數(shù)據(jù)行解鎖

在UPDATE和DELETE中使用WHERE CURRENT OF子串的語(yǔ)法如下

WHERE{CURRENT OF cursor_name|search_condition}

DELCARE CURSOR c IS SELECT empno salary FROM emp WHERE m IS NULL FOR UPDATE OF m; v_m NUMBER( ); BEGIN FOR r IN c LOOP IF r salary THEN v_m:=r salary* ; ELSEIF r salary THEN v_m:=r salary* ; ELSEIF r salary THEN v_m:=r salary* ; ELSE v_m:=r salary* ; END IF; UPDATE emp; SET m=v_m WHERE CURRENT OF c l; END LOOP; END

lishixinzhi/Article/program/Oracle/201311/16865

查看oracle已經(jīng)用了多少游標(biāo)

select * from v$sysstat where name like '%cursors%'

select * from v$parameter where name like '%cursors%'

select count(0) from v$open_cursor

select sid,count(*) from v$open_cursor group by sid

select count(*),sql_text from v$open_cursor group by sql_text order by count(*) desc

select KGLLKFLG,KGLNAOBJ from X$KGLLK where KGLLKFLG=8;

select max(cursor_count) from (select count(*) cursor_count from v$open_cursor where user_name='CRING_SMS')

在sqlplus中執(zhí)行

SELECT v.name, v.value value FROM V$PARAMETER v WHERE name = 'open_cursors';

看看value是多少

使用下面的命令可以修改它的大小:

在 oracle9i 中應(yīng)該可以直接進(jìn)行修改:

alter system set open_cursors=30000;

如果可以就直接生效了;如果不行可以使用下面的語(yǔ)句:

alter system set open_cursors=30000 scope=spfile;

然后重啟數(shù)據(jù)庫(kù)生效

分享題目:如何看oracle游標(biāo) oracle 游標(biāo) for
本文來源:http://www.chinadenli.net/article24/hpgsje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)網(wǎng)站建設(shè)軟件開發(fā)用戶體驗(yàn)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化