欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 2017 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條評論
主站蜘蛛池模板: 俄罗斯色妞18av | 日韩在线免费观看视频 | 国产萝控精品福利视频免费观看 | 久久色网| 欧美日韩一区二区中文字幕 | 97超级碰碰碰视频在线视频观看 | 久久99综合国产精品亚洲首页 | 欧美日韩国产一区二区三区播放 | 国产九九精品视频 | 91看片淫黄大片一级在线观看 | 日韩欧美精品在线 | 天天色综合5| 一区二区三区四区免费 | 成人午夜性a一级毛片美女 91精选 | 无码日本亚洲一区久久精品 | 天天干天操 | 天天操夜夜噜 | 国产97色在线 | 日韩 | 日本在线看 | 亚洲精品久久久久久国产精华液 | 午夜免费看片 | 国产黄的网站免费 | 香蕉久 | 嘿咻嘿咻免费区在线观看吃奶 | 欧美精品在线一区 | 波多野结衣的一级片 | 香蕉香蕉国产片一级一级毛片 | 日韩免费电影 | 91tm视频| 一级黄色片在线 | 大香萑75久久精品免费 | 色哟哟哟在线观看www | 精品a在线观看 | 快色成人| 日本高清精品 | 久久综合伊人 | 久久一本 | 蜜桃av一区二区三区 | 欧美第一页草草影院浮力 | 亚洲国产精品久久网午夜 | 久久精品国产免费中文 |