oraclesql游標
㈠ oracle 游標是做什麼用的
游標(CURSOR)也叫游標,在關系資料庫中經常使用,在PL/sql程序中可以用CURSOR與SELECT一起對表或者視圖中的數據進行查詢並逐行讀取。
Oracle游標分為顯示游標和隱式游標。
顯示游標(Explicit Cursor):在PL/SQL程序中定義的、用於查詢的游標稱作顯示游標。
隱式游標(Implicit Cursor):是指非PL/SQL程序中定義的、而且是在PL/SQL中使用UPDATE/DELETE語句時,Oracle系統自動分配的游標。
一.顯示游標
1.使用步驟
(1)定義 (2)打開 (3)使用 (4)關閉
2.使用演示
首先創建測試用表STUDENT,腳本如下:
CREATE TABLE "STUDENT" (
"STUNAME" VARCHAR2(10 BYTE),
"STUNO" VARCHAR2(4 BYTE),
"AGE" NUMBER,
"GENDER" VARCHAR2(2 CHAR)
)
(1).使用WHILE循環處理游標
create or replace PROCEDURE PROC_STU1 AS
BEGIN
--顯示游標使用,使用while循環
declare
--1.定義游標,名稱為cur_stu
cursor cur_stu is
select stuno,stuname from student order by stuno;
--定義變數,存放游標取出的數據
v_stuno varchar(4);
v_stuname varchar(20);
begin
--2.打開游標cur_stu
open cur_stu;
--3.將游標的當前行取出存放到變數中
fetch cur_stu into v_stuno,v_stuname;
while cur_stu%found --游標所指還有數據行,則繼續循環
loop
--列印結果
dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);
--繼續將游標所指的當前行取出放到變數中
fetch cur_stu into v_stuno,v_stuname;
end loop;
close cur_stu; --4.關閉游標
end;
END PROC_STU1;
(2).使用IF..ELSE代替WHILE循環處理游標
create or replace PROCEDURE PROC_STU2 AS
BEGIN
--顯示游標使用,使用if判斷
declare
--1.定義游標,名稱為cur_stu
cursor cur_stu is
select stuno,stuname from student order by stuno;
--定義變數,存放游標取出的數據
v_stuno varchar(4);
v_stuname varchar(20);
begin
--2.打開游標cur_stu
open cur_stu;
--3.將游標的當前行取出存放到變數中
fetch cur_stu into v_stuno,v_stuname;
loop
if cur_stu%found then --如果游標cur_stu所指還有數據行
--列印結果
dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);
--繼續將游標所指的當前行取出放到變數中
fetch cur_stu into v_stuno,v_stuname;
else
exit;
end if;
end loop;
close cur_stu; --4.關閉游標
end;
END PROC_STU2;
(3).使用FOR循環處理游標
create or replace PROCEDURE PROC_STU3 AS
BEGIN
--顯示游標使用,使用for循環
declare
--定義游標,名稱為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);
--循環做隱含檢查 %notfound
end loop;
--自動關閉游標
end;
END PROC_STU3;
(4).常用的使用EXIT WHEN處理游標
create or replace
PROCEDURE PROC_STU1_1 AS
BEGIN
--顯示游標使用,使用exit when循環
declare
--1.定義游標,名稱為cur_stu
cursor cur_stu is
select stuno,stuname from student order by stuno;
--定義變數,存放游標取出的數據
v_stuno varchar(4);
v_stuname varchar(20);
begin
--2.打開游標cur_stu
open cur_stu;
loop
--3.將游標的當前行取出存放到變數中
fetch cur_stu into v_stuno,v_stuname;
exit when cur_stu%notfound; --游標所指還有數據行,則繼續循環
--列印結果
dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);
end loop;
close cur_stu; --4.關閉游標
end;
END PROC_STU1_1;
二.隱式游標
1.使用演示
create or replace PROCEDURE PROC_STU4 AS
BEGIN
--隱式游標使用
update student set stuname='張燕廣' where stuno='1104';
--如果更新沒有匹配則插入一條新記錄
if SQL%NOTFOUND then
insert into student(STUNO,STUNAME,AGE,GENDER)
values('1104','張燕廣',18,'男');
end if;
END PROC_STU4;
2.說明
所有的SQL語句在上下文區內部都是可執行的,因為都有一個游標指向上下文區,此游標就是
SQL游標,與現實游標不同的是,SQL游標在PL/SQL中不需要打開和關閉,而是在執行UPDATE、
DELETE是自動打開和關閉。
上面例子中就是通過SQL%NOTFOUND游標屬性判斷UPDATE語句的執行結果決定是否需要插入新記錄。
㈡ 如何實現Oracle資料庫中的動態游標
createorreplaceprocereP_TEST_SQLis
TYPEref_cursor_typeISREFCURSOR;--定義一個動態游標
tablenamevarchar2(200)default'ess_client';
v_sqlvarchar2(1000);
mobilevarchar2(15);
usrsref_cursor_type;
begin
--使用連接符拼接成一條完整SQL
v_sql:='selectusrmsisdnfrom'||tablename||'whererownum<11';
--打開游標
openusrsforv_sql;
loop
fetchusrsintomobile;
exitwhenusrs%notfound;
insertintotmp(usrmsisdn)values(mobile);
endloop;
closeusrs;
commit;
endP_TEST_SQL;
㈢ Oracle下如何用sql創建游標
For 循環游標
(1)定義游標
(2)定義游標變數
(3)使用for循環來使用這個游標
declare
--類型定義
cursorc_job
is
selectempno,ename,job,sal
fromemp
wherejob='MANAGER';
--定義一個游標變數v_cinfoc_emp%ROWTYPE,該類型為游標c_emp中的一行數據類型
c_rowc_job%rowtype;
begin
forc_rowinc_jobloop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
endloop;
end;
Fetch游標
使用的時候必須要明確的打開和關閉
declare
--類型定義
cursorc_job
is
selectempno,ename,job,sal
fromemp
wherejob='MANAGER';
--定義一個游標變數
c_rowc_job%rowtype;
begin
openc_job;
loop
--提取一行數據到c_row
fetchc_jobintoc_row;
--判讀是否提取到值,沒取到值就退出
--取到值c_job%notfound是false
--取不到值c_job%notfound是true
exitwhenc_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
endloop;
--關閉游標
closec_job;
end;
㈣ oracle中游標的作用有哪些什麼情況下使用
存儲過程中查詢語句如何返回多行結果?我們知道,如果存儲過程中查詢語句有多行結果輸出,會報錯。若想讓存儲過程中的查詢語句返回多行結果不報錯,則需要使用游標來實現。本例主要也是用來熟悉存儲過程中游標的簡單使用方法:
SET SERVEROUTPUT ON;
create or replace procere proc_salary is
--定義變數
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
--定義游標
CURSOR emp_cursor IS SELECT empno, ename, sal from emp;
BEGIN--循環開始
LOOP
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor; END IF;
FETCH emp_cursor INTO v_empno, v_ename, v_sal;
--退出循環的條件
EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL;
dbms_output.put_line('員工編號為' || v_empno || '的' || v_ename || '薪水為:' || v_sal);
END LOOP;END;
/
㈤ oracle中游標的使用
這樣的問法好籠統,不過,還是把我整理的給你看看吧~個人整理,無復制的哦~
A:分類:
1:隱式游標:非用戶明確聲明而產生的游標. 你根本看不到cursor這個關鍵字.
2:顯示游標:用戶明確通過cursor關鍵字來聲明的游標.
3:引用游標:
B:什麼是隱式游標:
1:什麼時候產生:
會在執行任何合法的SQL語句中產生.他不一定存放數據.也有可能存放記錄集所影響的行數.
如果執行SELECT語句,這個時候游標會存放數據.如果執行INSERT、UPDATE、 DELETE會存放記錄影響的行數.
C:隱式游標叫什麼名字:
名字叫sql
關於sql的游標變數到底有哪些呢?
作用:返回最近一次執行SQL語句所涉及的游標相關信息.因為每執行一次SQL語句,都會產生一個隱式游標.那麼當前執行的SQL語句就是當前的隱式游標.
sql%found
sql%notfound
sql%rowcount
sql%isopen
D:關於隱式游標的例子:
create table 學生基本信息表
(
StuID number(2),
StuName varchar2(20)
)
alter table 學生基本信息表 add constraint PK_STUID primary key(StuID)
declare
num number:=0;
begin
num:=#
delete from 學生基本信息表 where StuID=num;
if sql%notfound then
dbms_output.put_line('該行數據沒有發現');
else
dbms_output.put_line('數據被發現並刪除,影響的行數為:'||sql%rowcount);
end if;
end;
E:關於顯示游標的例子:
1:如何定義顯示游標
declare cursor <cursor_name> is [select語句];
declare cursor mycur is select empno,ename,job from scott.emp;
2:如何打開游標:
open <cursor_name>;
open mycur;
3:如何通過游標來讀取數據
fetch <cursor_name> into <variable_list>
4:如何關閉游標:
close <cursor_name>;
close mycur;
注意:在Oracle中,不需要顯示銷毀游標.因為在Oracle中,很多東西是由JAVA寫的.Oracle會自動銷毀游標.
5:舉例:
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;--打開游標
fetch mycur into vempno,vename,vjob;--使用數據
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
dbms_output.put_line('讀取的數據為'||vempno||' '||vename||' '||vjob);
close mycur;
end;
因為只讀出來一條,所以要遍歷一下:
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—循環,遍歷
fetch mycur into vempno,vename,vjob;
exit when mycur%notfound;
if mycur%found then
dbms_output.put_line('讀取的數據為'||vempno||' '||vename||' '||vjob);
end if;
end loop;
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
close mycur;
end;
6:通常情況下我們在讀取表數據的時候,我們需要動態的去查詢.所以能不能在Oracle中給游標帶參數呢?可以!
1):如何定義帶參數的游標:
declare cursor <cursor_name>(參數名稱 參數類型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;
2):例子:
游標是一個集合,讀取數據有兩種方式
第一種方式: open fetch close
第二種方式: for 一但使用了for循環 ,在循環剛剛開始的時候,相當於執行open,在處理循環的時候,相當於執行fetch,在退出循環的時候,相當於執行了close
Declare cursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';
三種游標的例子:
--
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是怎樣使用游標的舉例說明!
一
游標是什麼
游標字面理解就是游動的游標。
用資料庫語言來描述:游標是映射在結果集中一行數據上的位置實體,有了游標,用戶就可以訪問結果集中的任意一行數據了,將游標放置到某行後,即可對該行數據進行操作,例如提取當前行的數據等。
二
游標的分類
顯式游標和隱式游標
顯式游標的使用需要4步:
1.
聲明游標
CURSOR
mycur(vartype
number)
is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no
=
vartype;
2.
打開游標
open
mycur(000627)
註:000627是參數
3.
讀取數據
fetch
mycur
into
varno,
varprice;
4.
關閉游標
close
mycur;
三
游標的屬性
oracle
游標有4個屬性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。
%ISOPEN判斷游標是否被打開,如果打開%ISOPEN等於true,否則等於false;
%FOUND
%NOTFOUND判斷游標所在的行是否有效,如果有效,則%FOUNDD等於true,否則等於false;
%ROWCOUNT返回當前位置為止游標讀取的記錄行數。
四
示例
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記錄的結構和C語言中的結構體類似,是由一組數據項構成的邏輯單元。
PL/SQL記錄並不保存在資料庫中,它與變數一樣,保存在內存空間中,在使用記錄時候,要首先定義記錄結構,然後聲明記錄變數。可以把PL/SQL記錄看作是一個用戶自定義的數據類型。
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;
典型游標for
循環
游標for循環示顯示游標的一種快捷使用方式,它使用for循環依次讀取結果集中的行數據,當form循環開始時,游標自動打開(不需要open),每循環一次系統自動讀取游標當前行的數據(不需要fetch),當退出for循環時,游標被自動關閉(不需要使用close)。使用游標for循環的時候不能使用open語句,fetch語句和close語句,否則會產生錯誤。
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游標
--OraclePL/SQL
declare
--定義游標
cursorcur_testis
select*fromemp;
v_empemp%rowtype;
begin
--打開游標
opencur_test;
loop
--獲取游標值
fetchcur_test
intov_emp;
exitwhencur_test%notfound;--屬性為是否提取數據成功,不成功則TRUE
dbms_output.put_line(v_emp.empno||'_'||v_emp.ename);
endloop;
--關閉游標
closecur_test;
end;
㈧ oracle如何關閉游標
1. 用open打開的,用close關閉
declare
cursor mycursor is
select * from emp for update;
myrecord emp%rowtype;
begin
open mycursor;
loop
fetch mycursor into myrecord;
exit when mycursor%notfound;
if (myrecord.sal=2000) then
update emp
set sal=2001
where current of mycursor;
end if;
end loop;
close mycursor;
commit;
end;
2. 用for 循環的,循環完了就自己關了
declare
cursor mycursor is
select * from emp;
begin
for i in mycursor
loop
dbms_output.put_line(i.job);
end loop;
end;
㈨ oracle如何關閉游標
第一,如果游標以open打開的,則使用close關閉:
declare;
cursor mycursor is;
select * from emp for update;
myrecord emp%rowtype;
begin
open mycursor;
loop
fetch mycursor into myrecord;
exit when mycursor%notfound;
if (myrecord.sal=2000) then
update emp
set sal=2018
where current of mycursor;
end if;
end loop;
close mycursor;
commit;
end;
第二,使用for 循環的,則循環結束游標自動關閉:
declare
cursor mycursor is
select * from emp;
begin
for i in mycursor
loop
dbms_output.put_line(i.job);
end loop;
end;
㈩ oracle SQL語句中的游標,函數和存儲過程的區別
游標有顯示游標和隱式游標之分,顯示游標需要自己去定義,declare cursor(這個自己看書去吧),這樣使用游標一條條地取值使用。而隱式游標針對所有的select語句都是的。
函數和存儲過程幾乎沒有區別,只是前者有返回值,後者沒有,如果後者定義了出參,那就和函數的功能是一樣的了。