亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

PL/SQL中游標和游標變量的使用

系統 1923 0
PL/SQL中游標和游標變量的使用(轉) 游標是什么:
??? 游標字面理解就是游動的光標。
??? 用數據庫語言來描述:游標是映射在結果集中一行數據上的位置實體,有了游標用戶就可以訪問結果集中的任意一行數據了,將游標放置到某行后,即可對該行數據進行操作,例如提取當前行的數據等等。
游標的分類: 顯式游標和隱式游標
(1)、顯示游標的使用:
??? 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;
(2)、隱式游標的使用:
如果在pl/sql程序中使用了select語句進行操作,pl/sql會隱含處理游標定義,即稱做隱式游標。這種游標不需要聲明、打開和關閉。
例:
Create or replace procedure cx_xm
(in_xh in char,out_num out char)
As
Begin
?????? Select xm into out_xm from xs where xh=in_xh;?? /*隱式游標必須使用into*/
??? Dbms_output.put_line(out_xm);
End
使用隱式游標時要注意以下幾點:
A、每一個隱式游標必須有一個into;
B、和顯示游標一樣,帶有關鍵字into接收數據的變量時數據類型要與列表一致。
C、隱式游標一次只能返回移行數據。

典型游標for 循環

游標for循環和顯示游標的一種快捷使用方式,它使用for循環依次讀取結果集中的行數據,當for循環開始時,游標自動打開(不需要 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;

在游標FOR循環中使用查詢

在游標FOR循環中可以定義查詢,由于沒有顯式聲明所以游標沒有名字,記錄名通過游標查詢來定義。
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:=0;
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;

游標中的子查詢
語法如下:
CURSOR C1 IS SELECT * FROM emp
WHERE deptno NOT IN (SELECT deptno
FROM dept
WHERE dname!='ACCOUNTING');
可以看出與SQL中的子查詢沒有什么區別。

游標中的更新和刪除
在PL/SQL中依然可以使用UPDATE和DELETE語句更新或刪除數據行。顯式游標只有在需要獲得多行數據的情況下使用。PL/SQL提供了僅僅使用游標就可以執行刪除或更新記錄的方法。
UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執行UPDATE或DELETE操作的表中取出的最近的數據。要使用這個方法,在聲明游標時必須使用FOR UPDATE子串,當對話使用FOR UPDATE子串打開一個游標時,所有返回集中的數據行都將處于行級(ROW-LEVEL)獨占式鎖定,其他對象只能查詢這些數據行,不能進行 UPDATE、DELETE或SELECT...FOR UPDATE操作。
語法:
FOR UPDATE [OF [schema.]table.column[,[schema.]table.column]..
[nowait]
在多表查詢中,使用OF子句來鎖定特定的表,如果忽略了OF子句,那么所有表中選擇的數據行都將被鎖定。如果這些數據行已經被其他會話鎖定,那么正常情況下ORACLE將等待,直到數據行解鎖。
在UPDATE和DELETE中使用WHERE CURRENT OF子串的語法如下:
WHERE{CURRENT OF cursor_name|search_condition}

例:
DELCARE
CURSOR c1 IS SELECT empno,salary
FROM emp
WHERE comm IS NULL
FOR UPDATE OF comm;
v_comm NUMBER(10,2);
BEGIN
FOR r1 IN c1 LOOP
IF r1.salary<500 THEN
v_comm:=r1.salary*0.25;
ELSEIF r1.salary<1000 THEN
v_comm:=r1.salary*0.20;
ELSEIF r1.salary<3000 THEN
v_comm:=r1.salary*0.15;
ELSE
v_comm:=r1.salary*0.12;
END IF;
UPDATE emp;
SET comm=v_comm
WHERE CURRENT OF c1l;
END LOOP;
END

使用游標變量:
與游標類似,游標變量指向多行查詢的結果集的當前行。但是,游標與游標變量是不同的,就像常量和變量的關系一樣。游標是靜態的,游標變量是動態的,因為它不與特定的查詢綁定在一起。
(1)、用法1:
declare
type cur_tab is ref cursor;
sqlcur cur_tab;
v_T3100101 char(2);
v_T3100102 char(10);
begin
open sqlcur for select T3100101,T3100102 from T31001;
loop
fetch sqlcur into v_T3100101,v_T3100102;
exit when sqlcur%notfound;
dbms_output.put_line(v_T3100101||v_T3100102);
end loop;
close sqlcur;
end;


(2)、用法2:用于存儲過程返回結果集
create or replace package selecttable
is
type cur_T31001 is ref cursor return T31001%rowtype;  --注意,這里沒有begin
end selecttable;

create or replace procedure T31001_select
(
cur out selecttable.cur_T31001?????? --參數類型定義為先前定義好的T31001
)
is
begin
open cur for
select * from T31001;
end T31001_select;
----------------------------------------------------------------------------------------------------------------------
通過從游標工作區中抽取出來的數據,可以對數據庫中的數據進行操縱,包括修改與刪除操作。
要想通過游標操縱數據庫,在定義游標的時候,必須加上FOR UPDATE OF子句;

而且在UPDATE或DELETE時,必須加上WHERE CURRENT OF子句,則游標所在行被更新或者刪除。

PL/SQL中游標和游標變量的使用


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天天爱夜夜做 | 国产成人h片视频在线观看 国产成人h综合亚洲欧美在线 | 国产91福利在线精品剧情尤物 | 欧美一级毛片特黄大 | 国产激情视频一区二区三区 | 日本免费一区视频 | 成人影院午夜久久影院 | 99热精品在线 | 四虎tv| 99久久国产综合精品五月天 | 精品哟啊呦v视频在线观看 精品哟哟国产在线观看 | 日本三级日本三级人妇三级四 | 欧美一级片免费看 | 狠狠色婷婷丁香综合久久韩国 | 亚洲qingse中文字幕久久 | 国产精品香蕉一区二区三区 | 激情狠狠干 | 天天综合日日噜噜噜 | 91九色视频| 久艹在线播放 | 色婷综合 | 国产精品麻豆久久99 | 国产精品露脸张开双腿 | 麻豆精品久久精品色综合 | 国产成+人+综合+亚洲不卡 | 亚洲国产欧美在线人成 | 无遮挡无遮挡91桃色在线观看 | 福利社看片| 毛片大全网站 | 国产午夜偷精品偷伦 | 国产69精品久久久久999小说 | 一级大毛片 | 精品久久伦理中文字幕 | 日本爱爱免费视频 | 久久影院精品 | 九九免费精品视频在这里 | 国内精品综合九九久久精品 | 亚洲第一区第二区 | 欧美a毛片 | 亚洲狠狠婷婷综合久久久久网站 | 福利在线影院 |