新聞中心
游標(biāo)是什么?ORACLE是怎樣使用游標(biāo)的?舉例說明!
一
創(chuàng)新互聯(lián)專注于龍巖網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供龍巖營銷型網(wǎng)站建設(shè),龍巖網(wǎng)站制作、龍巖網(wǎng)頁設(shè)計(jì)、龍巖網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造龍巖網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供龍巖網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
游標(biāo)是什么
游標(biāo)字面理解就是游動的光標(biāo)。
用數(shù)據(jù)庫語言來描述:游標(biāo)是映射在結(jié)果集中一行數(shù)據(jù)上的位置實(shí)體,有了游標(biāo),用戶就可以訪問結(jié)果集中的任意一行數(shù)據(jù)了,將游標(biāo)放置到某行后,即可對該行數(shù)據(jù)進(jìn)行操作,例如提取當(dāng)前行的數(shù)據(jù)等。
二
游標(biāo)的分類
顯式游標(biāo)和隱式游標(biāo)
顯式游標(biāo)的使用需要4步:
1.
聲明游標(biāo)
CURSOR
mycur(vartype
number)
is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no
=
vartype;
2.
打開游標(biāo)
open
mycur(000627)
注:000627是參數(shù)
3.
讀取數(shù)據(jù)
fetch
mycur
into
varno,
varprice;
4.
關(guān)閉游標(biāo)
close
mycur;
三
游標(biāo)的屬性
oracle
游標(biāo)有4個(gè)屬性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。
%ISOPEN判斷游標(biāo)是否被打開,如果打開%ISOPEN等于true,否則等于false;
%FOUND
%NOTFOUND判斷游標(biāo)所在的行是否有效,如果有效,則%FOUNDD等于true,否則等于false;
%ROWCOUNT返回當(dāng)前位置為止游標(biāo)讀取的記錄行數(shù)。
四
示例
set
serveroutput
on;
declare
varno
varchar2(20);
varprice
varchar2(20);
CURSOR
mycur(vartype
number)
is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no
=
vartype;
begin
if
mycur%isopen
=
false
then
open
mycur(000627);
end
if;
fetch
mycur
into
varno,varprice;
while
mycur%found
loop
dbms_output.put_line(varno||','||varprice);
if
mycur%rowcount=2
then
exit;
end
if;
fetch
mycur
into
varno,varprice;
end
loop;
close
mycur;
end;
PL/SQL記錄的結(jié)構(gòu)和C語言中的結(jié)構(gòu)體類似,是由一組數(shù)據(jù)項(xiàng)構(gòu)成的邏輯單元。
PL/SQL記錄并不保存在數(shù)據(jù)庫中,它與變量一樣,保存在內(nèi)存空間中,在使用記錄時(shí)候,要首先定義記錄結(jié)構(gòu),然后聲明記錄變量。可以把PL/SQL記錄看作是一個(gè)用戶自定義的數(shù)據(jù)類型。
set
serveroutput
on;
declare
type
person
is
record
(
empno
cus_emp_basic.emp_no%type,
empzc
cus_emp_basic.emp_zc%type);
person1
person;
cursor
mycur(vartype
number)is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no=vartype;
begin
if
mycur%isopen
=
false
then
open
mycur(000627);
end
if;
loop
fetch
mycur
into
person1;
exit
when
mycur%notfound;
dbms_output.put_line('雇員編號:'||person1.empno||',地址:'||person1.empzc);
end
loop;
close
mycur;
end;
典型游標(biāo)for
循環(huán)
游標(biāo)for循環(huán)示顯示游標(biāo)的一種快捷使用方式,它使用for循環(huán)依次讀取結(jié)果集中的行數(shù)據(jù),當(dāng)form循環(huán)開始時(shí),游標(biāo)自動打開(不需要open),每循環(huán)一次系統(tǒng)自動讀取游標(biāo)當(dāng)前行的數(shù)據(jù)(不需要fetch),當(dāng)退出for循環(huán)時(shí),游標(biāo)被自動關(guān)閉(不需要使用close)。使用游標(biāo)for循環(huán)的時(shí)候不能使用open語句,fetch語句和close語句,否則會產(chǎn)生錯(cuò)誤。
set
serveroutput
on;
declare
cursor
mycur(vartype
number)is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no=vartype;
begin
for
person
in
mycur(000627)
loop
dbms_output.put_line('雇員編號:'||person.emp_no||',地址:'||person.emp_zc);
end
loop;
end;
oracle 游標(biāo)的使用
Oracle 使用BULK COLLECT 處理游標(biāo)的時(shí)候,LIMIT 后面的數(shù)字,意思是一批處理多少條。
例如你一個(gè)表,有1千萬條記錄。
你不加任何限制,一口氣全部加載到內(nèi)存里面,最后也不見得提升你存儲過程的性能。
但是你調(diào)整得好,比如 LIMIT 5000, 也就是游標(biāo)每批 5千條數(shù)據(jù)這么加載。
性能肯定比一條一條加載起來的效果要好。
不使用 BULK COLLECT 處理游標(biāo)的例子:
使用 BULK COLLECT 處理游標(biāo)的例子:
例子僅僅演示語法,沒有實(shí)際的測試性能。僅供參考。
oracle游標(biāo)怎么使用?創(chuàng)建完了 怎么用?
在定義參數(shù)游標(biāo)之后,當(dāng)使用不同參數(shù)值多次打開游標(biāo)時(shí),可以產(chǎn)生不同的結(jié)果集,語法如下:
cursor
cursor_name(parameter_name
datatype)
is
select_statement;
定義參數(shù)游標(biāo)時(shí),游標(biāo)參數(shù)只能指定數(shù)據(jù)類型,而不能指定長度。
示例如下:
declare
cursor
temp_cursor(no
number)
is
select
name
from
cip_temps
where
id=no;
v_name
cip_temps.name%type;
begin
open
temp_cursor(1);
loop
oracle中游標(biāo)的使用?
這樣的問法好籠統(tǒng),不過,還是把我整理的給你看看吧~個(gè)人整理,無復(fù)制的哦~
A:分類:
1:隱式游標(biāo):非用戶明確聲明而產(chǎn)生的游標(biāo). 你根本看不到cursor這個(gè)關(guān)鍵字.
2:顯示游標(biāo):用戶明確通過cursor關(guān)鍵字來聲明的游標(biāo).
3:引用游標(biāo):
B:什么是隱式游標(biāo):
1:什么時(shí)候產(chǎn)生:
會在執(zhí)行任何合法的SQL語句中產(chǎn)生.他不一定存放數(shù)據(jù).也有可能存放記錄集所影響的行數(shù).
如果執(zhí)行SELECT語句,這個(gè)時(shí)候游標(biāo)會存放數(shù)據(jù).如果執(zhí)行INSERT、UPDATE、 DELETE會存放記錄影響的行數(shù).
C:隱式游標(biāo)叫什么名字:
名字叫sql
關(guān)于sql的游標(biāo)變量到底有哪些呢?
作用:返回最近一次執(zhí)行SQL語句所涉及的游標(biāo)相關(guān)信息.因?yàn)槊繄?zhí)行一次SQL語句,都會產(chǎn)生一個(gè)隱式游標(biāo).那么當(dāng)前執(zhí)行的SQL語句就是當(dāng)前的隱式游標(biāo).
sql%found
sql%notfound
sql%rowcount
sql%isopen
D:關(guān)于隱式游標(biāo)的例子:
create table 學(xué)生基本信息表
(
StuID number(2),
StuName varchar2(20)
)
alter table 學(xué)生基本信息表 add constraint PK_STUID primary key(StuID)
declare
num number:=0;
begin
num:=num;
delete from 學(xué)生基本信息表 where StuID=num;
if sql%notfound then
dbms_output.put_line('該行數(shù)據(jù)沒有發(fā)現(xiàn)');
else
dbms_output.put_line('數(shù)據(jù)被發(fā)現(xiàn)并刪除,影響的行數(shù)為:'||sql%rowcount);
end if;
end;
E:關(guān)于顯示游標(biāo)的例子:
1:如何定義顯示游標(biāo)
declare cursor cursor_name is [select語句];
declare cursor mycur is select empno,ename,job from scott.emp;
2:如何打開游標(biāo):
open cursor_name;
open mycur;
3:如何通過游標(biāo)來讀取數(shù)據(jù)
fetch cursor_name into variable_list
4:如何關(guān)閉游標(biāo):
close cursor_name;
close mycur;
注意:在Oracle中,不需要顯示銷毀游標(biāo).因?yàn)樵贠racle中,很多東西是由JAVA寫的.Oracle會自動銷毀游標(biāo).
5:舉例:
declare
cursor mycur is select empno,ename,job from emp; --創(chuàng)建游標(biāo)
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;--打開游標(biāo)
fetch mycur into vempno,vename,vjob;--使用數(shù)據(jù)
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
dbms_output.put_line('讀取的數(shù)據(jù)為'||vempno||' '||vename||' '||vjob);
close mycur;
end;
因?yàn)橹蛔x出來一條,所以要遍歷一下:
declare
cursor mycur is select empno,ename,job from emp;
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;
loop—循環(huán),遍歷
fetch mycur into vempno,vename,vjob;
exit when mycur%notfound;
if mycur%found then
dbms_output.put_line('讀取的數(shù)據(jù)為'||vempno||' '||vename||' '||vjob);
end if;
end loop;
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
close mycur;
end;
6:通常情況下我們在讀取表數(shù)據(jù)的時(shí)候,我們需要?jiǎng)討B(tài)的去查詢.所以能不能在Oracle中給游標(biāo)帶參數(shù)呢?可以!
1):如何定義帶參數(shù)的游標(biāo):
declare cursor cursor_name(參數(shù)名稱 參數(shù)類型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;
2):例子:
游標(biāo)是一個(gè)集合,讀取數(shù)據(jù)有兩種方式
第一種方式: open fetch close
第二種方式: for 一但使用了for循環(huán) ,在循環(huán)剛剛開始的時(shí)候,相當(dāng)于執(zhí)行open,在處理循環(huán)的時(shí)候,相當(dāng)于執(zhí)行fetch,在退出循環(huán)的時(shí)候,相當(dāng)于執(zhí)行了close
Declare cursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';
三種游標(biāo)的例子:
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
MY_CUR EMP%ROWTYPE;
BEGIN
OPEN TEST_CUR;
FETCH TEST_CUR INTO MY_CUR;
WHILE TEST_CUR%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
FETCH TEST_CUR INTO MY_CUR;
END LOOP;
CLOSE TEST_CUR;
END;
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
BEGIN
FOR MY_CUR IN TEST_CUR
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;
--
DECLARE
CURSOR TEST_CUR(V_SAL NUMBER) IS
SELECT *
FROM EMP
WHERE SAL V_SAL;
V_SAL1 NUMBER ;
BEGIN
V_SAL1 := 2000;
FOR MY_CUR IN TEST_CUR(V_SAL1)
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;
Oracle 游標(biāo)
游標(biāo)能夠根據(jù)查詢條件從數(shù)據(jù)表中提取一組記錄,將其作為一個(gè)臨時(shí)表置于數(shù)據(jù)緩沖區(qū)中,利用指針逐行對記錄數(shù)據(jù)進(jìn)行操作。
Oracle中的游標(biāo)分為顯示游標(biāo)和隱式游標(biāo) 。
在執(zhí)行SQL語句時(shí),Oracle會自動創(chuàng)建隱式游標(biāo),該游標(biāo)是內(nèi)存中處理該語句的數(shù)據(jù)緩沖區(qū),存儲了執(zhí)行SQL語句的結(jié)果。通過隱式游標(biāo)屬性可獲知SQL語句的執(zhí)行狀態(tài)信息。
%found:布爾型屬性,如果sql語句至少影響到一行數(shù)據(jù),值為true,否則為false。
%notfound:布爾型屬性,與%found相反。
%rowcount:數(shù)字型屬性,返回受sql影響的行數(shù)。
%isopen:布爾型屬性,當(dāng)游標(biāo)已經(jīng)打開時(shí)返回true,游標(biāo)關(guān)閉時(shí)則為false。
用戶可以顯式定義游標(biāo)。使用顯式游標(biāo)處理數(shù)據(jù)要4個(gè)步驟:定義游標(biāo)、打開游標(biāo)、提取游標(biāo)數(shù)據(jù)和關(guān)閉游標(biāo)。
游標(biāo)由游標(biāo)名稱和游標(biāo)對應(yīng)的select結(jié)果集組成。定義游標(biāo)應(yīng)該放在pl/sql程序塊的聲明部分。
語法格式:cursor 游標(biāo)名稱(參數(shù)) is 查詢語句
打開游標(biāo)時(shí),游標(biāo)會將符合條件的記錄送入數(shù)據(jù)緩沖區(qū),并將指針指向第一條記錄。
語法格式:open 游標(biāo)名稱(參數(shù));
將游標(biāo)中的當(dāng)前行數(shù)據(jù)賦給指定的變量或記錄變量。
語法格式:fetch 游標(biāo)名稱 into 變量名;
游標(biāo)一旦使用完畢,就應(yīng)將其關(guān)閉,釋放與游標(biāo)相關(guān)聯(lián)的資源。
語法格式:close 游標(biāo)名稱;
declare
cursor c1 is? select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
loop
? fetch c1 into v_sno,v_cno,v_grade;
? exit when c1%notfound;--緊跟fetch之后
if c1%found then
dbms_output.put_line(to_char(c1%rowcount)||v_cno);
end if;
end loop;
close c1;?
end;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
fetch c1 into v_sno,v_cno,v_grade;
while c1%found loop
? dbms_output.put_line(v_sno||v_cno||v_grade);
?fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;?
end;
第三種:for
declare
cursor c1 is select sno,cno,grade from sc;
begin
for item in c1 loop
dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
end loop;
end;
oracle中如何定義一個(gè)游標(biāo)?
1.游標(biāo)定義:\x0d\x0acursor XXXA is\x0d\x0a SELECT 語句;\x0d\x0aXXXB cursorName%rowtype;\x0d\x0a\x0d\x0aXXXA: 游標(biāo)名\x0d\x0aXXXB: 游標(biāo)行數(shù)據(jù)定義\x0d\x0a\x0d\x0a2. 打開游標(biāo):\x0d\x0a-- 打開之前最好先關(guān)一下,防止上次發(fā)生異常沒有關(guān)掉而引發(fā)不必要的異常\x0d\x0a IF XXXA%ISOPEN THEN\x0d\x0a CLOSE XXXA;\x0d\x0a END IF;\x0d\x0a\x0d\x0aOpen XXXA ;\x0d\x0a Loop\x0d\x0a Fetch XXXA into XXXB;\x0d\x0a exit when XXXA%NOTFOUND;\x0d\x0a... ... 處理邏輯\x0d\x0a end loop;\x0d\x0a close XXXA;
新聞名稱:oracle怎么使用游標(biāo),oracle的游標(biāo)使用
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/hsejei.html