-
1、光標(biāo)的屬性
%found:光標(biāo)中是否有數(shù)據(jù),有則返回true,無(wú)返回false。
%notfound:與上面相反。
%isopen:判斷光標(biāo)是否打開(kāi),打開(kāi)返回true,否則返回false。
%rowcount:影響的行數(shù),例如光標(biāo)中有100條記錄,現(xiàn)在這個(gè)指針到10行這里,那么它聚會(huì)返回10。它不是總行數(shù)。

2、光標(biāo)數(shù)的限制:默認(rèn)情況下,oracle數(shù)據(jù)庫(kù)允許在同一會(huì)話下,只能打開(kāi)300個(gè)光標(biāo)(可以查看oracle初始化參數(shù)得到這個(gè)值)。它的意思是指open?光標(biāo)之后,打開(kāi)到一定數(shù)量就不可以在打開(kāi)光標(biāo)了。
注意:查詢數(shù)據(jù)庫(kù)參數(shù)時(shí),需要使用管理員,這里使用sysdba。show parameter這里是模糊查詢,后面可以接查詢的名,它會(huì)自動(dòng)加%%,如圖。

修改系統(tǒng)參數(shù)語(yǔ)法:alter?system?set?參數(shù)字段=值。如圖,這里的scope代表范圍,它有三個(gè)值。如果scope為memory,那么修改只是更改當(dāng)前實(shí)例,不更改參數(shù)文件。如果為spfile,那么修改只是更改參數(shù)文件,不更改當(dāng)前實(shí)例(如果是spfile,數(shù)據(jù)庫(kù)需要重新啟動(dòng))。both代表前兩個(gè)同時(shí)更改。
查看全部 -
使用PL/SQL完成員工漲工資。
注意:演示過(guò)程中,執(zhí)行完P(guān)L/SQL,查詢卻沒(méi)有漲工資,這是因?yàn)镻L/SQL執(zhí)行它是一個(gè)事物,而查詢是一個(gè)事物,PL/SQL執(zhí)行完需要提交事物,否則查詢就會(huì)發(fā)生沒(méi)有改變。所以一定注意寫完P(guān)L/SQL程序后,如果修改了數(shù)據(jù)庫(kù)中的記錄必須要提交事物。這里為了顯示剛才增加的工資所以在上面添加rollback,回滾到修改之前的工資。


——總結(jié)——
1、oracle數(shù)據(jù)庫(kù)默認(rèn)開(kāi)啟數(shù)據(jù)庫(kù)事務(wù)。
2、oracle,默認(rèn)的事物隔離級(jí)別是read?commited。
查看全部 -
光標(biāo):PL/SQL中使用光標(biāo)代表一個(gè)集合(ResultSet)。
光標(biāo)語(yǔ)法:如圖,注意:定義光標(biāo)時(shí),CURSOR是定義光標(biāo)的關(guān)鍵字,變量的名字放在它后面。


使用光標(biāo)語(yǔ)法:如圖,它的意思相當(dāng)于執(zhí)行select語(yǔ)句,得到集合。如圖,從光標(biāo)中取值并放入變量pename中。如圖,當(dāng)使用完光標(biāo)后,還需要關(guān)閉,它的意思釋放光標(biāo)占用系統(tǒng)的一些資源。



fetch的作用:如圖,它有兩點(diǎn)作用。1、當(dāng)開(kāi)啟光標(biāo)的時(shí)候,初始化光標(biāo)后,集合會(huì)有一個(gè)指針指向集合的第一條記錄地址,fetch的第一個(gè)作用就是將該指針指向的記錄返回。2、將指針移動(dòng)后一條記錄的地址。所以可以通過(guò)循環(huán)這個(gè)光標(biāo)來(lái)返回集合中所有的記錄。


舉例:通過(guò)光標(biāo)打印所有員工姓名和工資,定義光標(biāo)規(guī)范,盡量把fetch后的變量和光標(biāo)定義在一塊。這里需要注意into后面字段的順序要和查詢語(yǔ)句的返回字段順序一一對(duì)應(yīng)。
判斷光標(biāo)中是否還有數(shù)據(jù)語(yǔ)法:這里需要了解光標(biāo)的屬性。
光標(biāo)的屬性:總共有四個(gè)屬性。1、%found它代表如果fetch取到值,它的值就為true,否則就為false。2、%notfound它代表與第一種相反的意思。


查看全部 -
PL/SQL光標(biāo)的引入:如圖,在Java中如果想要循環(huán)select查詢結(jié)果集合中的每一個(gè)數(shù)據(jù),可以通過(guò)ResultSet,通過(guò)對(duì)象的next()方法,遍歷集合中每一個(gè)數(shù)據(jù)。光標(biāo)的作用就是這樣子的。
查看全部 -
PL/SQL循環(huán)語(yǔ)句的使用
第一種循環(huán)語(yǔ)句形式:當(dāng)條件滿足total<=25000時(shí),執(zhí)行LOOP和END LOOP之間的循環(huán)體,不滿足時(shí)退出循環(huán)。

舉例:注意,PL/SQL中沒(méi)有++這種自增運(yùn)算符。


第二種循環(huán)語(yǔ)句形式:如果滿足when后面的條件,則跳出循環(huán)體。不滿足則執(zhí)行循環(huán)體。

舉例:如圖。


第三種循環(huán)語(yǔ)句形式:I是循環(huán)變量,IN后面是循環(huán)變量的取值,像這里就是從1取到3,其中1..3代表1、2、3三個(gè)數(shù)字,注意..的使用必須是連續(xù)的數(shù)字。
?

舉例:如圖。


推薦使用第二種循環(huán),因?yàn)檫@種方式使用光標(biāo)比較方便。
查看全部 -
PL/SQL中if語(yǔ)句的使用(語(yǔ)句序列DML語(yǔ)句)
第一種IF語(yǔ)句形式,如圖。

第二種IF語(yǔ)句形式,如圖。

第三種IF語(yǔ)句形式,如圖。

舉例:判斷用戶從鍵盤輸入的數(shù)字。1、如何使用if語(yǔ)句。2、如何接受一個(gè)鍵盤的輸入(鍵盤輸入的都是字符串)。

查看全部 -
引用型變量:其中my_name表示變量名,emp表示員工表,ename表示員工名字段,整句代表引用emp表的ename字段類型作為該變量的類型。
引用型變量?jī)?yōu)勢(shì):它會(huì)隨著參考類型改變而改變。

舉例:注意在PL/SQL中,賦值有兩種方式,一種是:=,另一種是使用into關(guān)鍵字,oracle中的dbms_output包的put_line參數(shù)中的連接符||。

記錄型變量:取表中一行變量的類型作為變量的類型,可以理解記錄型變量為數(shù)組,數(shù)組中的每一個(gè)元素就代表這一行的每一列,如果要引用其中某一列,可以通過(guò)——》變量名.字段名

舉例:
查看全部 -
PL/SQL的完整程序結(jié)構(gòu)

變量的定義語(yǔ)法:如圖,需要注意的是變量名稱放在類型前,賦值使用:=。

舉例:這里可以使用sysdate來(lái)獲取當(dāng)前時(shí)間。
查看全部 -
PL/SQL(Procedure Language/SQL):Oracle對(duì)sql語(yǔ)言的過(guò)程化擴(kuò)展,指在SQL命令語(yǔ)言中增加了過(guò)程處理語(yǔ)句。例如:分支、循環(huán)等,使SQL語(yǔ)言具有過(guò)程處理能力,PL/SQL是面向過(guò)程的語(yǔ)言。

如下這種方式,就需要使用PL/SQL來(lái)實(shí)現(xiàn)。

查看全部 -
學(xué)習(xí)PL/SQL作用
1、對(duì)oracle的一個(gè)擴(kuò)展。
例如:漲工資,可以通過(guò)java使用jdbc來(lái)操作,這里可以通過(guò)調(diào)用PL/SQL來(lái)操作,它的效率是操作oracle數(shù)據(jù)庫(kù)最高的,相比其他語(yǔ)言。
2、它是學(xué)習(xí)存儲(chǔ)過(guò)程、自定義函數(shù)、觸發(fā)器的基礎(chǔ)。
舉例:簡(jiǎn)單的PL/SQL例子,它以declare開(kāi)頭代表聲明。接下來(lái)是說(shuō)明,它是一個(gè)程序,所以它會(huì)有變量,光標(biāo),例外,這里指對(duì)他們的聲明。程序以begin開(kāi)始,end;結(jié)束,中間是程序體。(dbms_output是PL/SQL提供的程序包,這個(gè)程序包中提供了很多的方法,其中put_line()它是一個(gè)存儲(chǔ)過(guò)程,它的作用是接受一個(gè)字符串打印在屏幕上)。最后需要/,代表退出編輯環(huán)境,并且執(zhí)行PL/SQL程序。此時(shí)還需要一個(gè)操作,因?yàn)槟J(rèn)oracle的輸出開(kāi)關(guān)是關(guān)閉的,通過(guò)set serveroutput on打開(kāi)輸出開(kāi)關(guān)。這里的/代表執(zhí)行上一條SQL語(yǔ)句或者上一條PL/SQL程序。
注意:如果程序沒(méi)有說(shuō)明部分那么前面的declare可以不寫。


Oracle中包的位置,可以通過(guò)查看文檔了解包的用途。


其中第一個(gè)表示Oracle數(shù)據(jù)庫(kù)中提供了哪些程序包,第二個(gè)相當(dāng)于語(yǔ)法手冊(cè),代表怎么使用。


拉到最下方可以看到oracle10g中提供了198個(gè)程序包。

而dbms這個(gè)包是第68個(gè)可以查看它的overview概述,它還提供了一些examples,還可以查看這個(gè)程序包中有哪些子程序,像put_line這個(gè)存儲(chǔ)過(guò)程,通過(guò)它可以了解每一個(gè)包的詳細(xì)用法。


在命令行中直接使用命令(desc?包名)查看包的結(jié)構(gòu),這種形式查看更為簡(jiǎn)潔。

put_line它是一個(gè)存儲(chǔ)過(guò)程,需要一個(gè)參數(shù)A,并且類型為字符串,并且為輸入?yún)?shù)。
查看全部 -
set serveroutput on
declare
cursor cemp is select empno,sal from emp order by sal;
pempno emp.empno%type;
psal? ? ? ? emp.sal%type;
countEmp number:=0;
salTotal number;
begin
?select sum(sal) into salTotal from emp;
open cemp;
?loop
? exit when salTotal > 50000;
? fetch cemp into pempno,psal;
? exit when cemp%notfound;
? update emp set sal = sal*1.1 where empno =pempno;
? countEmp := countEmp +1;
? salTotal:=salTotal + psal*0.1;?
?end loop;
close cemp;
dbms.output.put_line();
end;
/
查看全部 -
set serveroutput on
declare
cursor cemp is select to_char(hiredate,'yyyy')? from emp;
phiredate varchar2(4);
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;
begin
open cemp;
?loop
?fetch cemp into phiredate;
?exit when cemp%notfound;
?
?if phiredate = '1980' then count80:=count80+1;
?elsif phiredate = '1981' then count80:=count81+1;
?elsif phiredate = '1982' then count80:=count82+1;
?else? count87:=count87+1;
end if;
close cemp;
dbms.output.put_line();
end;
/
查看全部 -
set sereroutput on
declare
? cursor cemp is select ename from emp where deptno = 50;
? pename emp.ename%type;
? no_emp_found exception;
begin
?open cemp;
?fetch cemp into pename;
?if cemp%notfound then?
? ?raise no_emp_found;??
?end if;
?close cemp;
exception
? when no_emp_found then dbms_output.put_line();
? when others then dbms_output.put_line();
end;
/
查看全部 -
自定義例外
查看全部 -
修改光標(biāo)數(shù)的限制
alter system set open_cursor = 400 scope = both;
memory 只改當(dāng)前實(shí)例
spfile 改參數(shù)文件,需要重啟數(shù)據(jù)庫(kù)
查看全部
舉報(bào)