-
1、光標(biāo)的屬性
%found:光標(biāo)中是否有數(shù)據(jù),有則返回true,無返回false。
%notfound:與上面相反。
%isopen:判斷光標(biāo)是否打開,打開返回true,否則返回false。
%rowcount:影響的行數(shù),例如光標(biāo)中有100條記錄,現(xiàn)在這個(gè)指針到10行這里,那么它聚會返回10。它不是總行數(shù)。
2、光標(biāo)數(shù)的限制:默認(rèn)情況下,oracle數(shù)據(jù)庫允許在同一會話下,只能打開300個(gè)光標(biāo)(可以查看oracle初始化參數(shù)得到這個(gè)值)。它的意思是指open?光標(biāo)之后,打開到一定數(shù)量就不可以在打開光標(biāo)了。
注意:查詢數(shù)據(jù)庫參數(shù)時(shí),需要使用管理員,這里使用sysdba。show parameter這里是模糊查詢,后面可以接查詢的名,它會自動加%%,如圖。
修改系統(tǒng)參數(shù)語法:alter?system?set?參數(shù)字段=值。如圖,這里的scope代表范圍,它有三個(gè)值。如果scope為memory,那么修改只是更改當(dāng)前實(shí)例,不更改參數(shù)文件。如果為spfile,那么修改只是更改參數(shù)文件,不更改當(dāng)前實(shí)例(如果是spfile,數(shù)據(jù)庫需要重新啟動)。both代表前兩個(gè)同時(shí)更改。
查看全部 -
使用PL/SQL完成員工漲工資。
注意:演示過程中,執(zhí)行完P(guān)L/SQL,查詢卻沒有漲工資,這是因?yàn)镻L/SQL執(zhí)行它是一個(gè)事物,而查詢是一個(gè)事物,PL/SQL執(zhí)行完需要提交事物,否則查詢就會發(fā)生沒有改變。所以一定注意寫完P(guān)L/SQL程序后,如果修改了數(shù)據(jù)庫中的記錄必須要提交事物。這里為了顯示剛才增加的工資所以在上面添加rollback,回滾到修改之前的工資。
——總結(jié)——
1、oracle數(shù)據(jù)庫默認(rèn)開啟數(shù)據(jù)庫事務(wù)。
2、oracle,默認(rèn)的事物隔離級別是read?commited。
查看全部 -
光標(biāo):PL/SQL中使用光標(biāo)代表一個(gè)集合(ResultSet)。
光標(biāo)語法:如圖,注意:定義光標(biāo)時(shí),CURSOR是定義光標(biāo)的關(guān)鍵字,變量的名字放在它后面。
使用光標(biāo)語法:如圖,它的意思相當(dāng)于執(zhí)行select語句,得到集合。如圖,從光標(biāo)中取值并放入變量pename中。如圖,當(dāng)使用完光標(biāo)后,還需要關(guān)閉,它的意思釋放光標(biāo)占用系統(tǒng)的一些資源。
fetch的作用:如圖,它有兩點(diǎn)作用。1、當(dāng)開啟光標(biāo)的時(shí)候,初始化光標(biāo)后,集合會有一個(gè)指針指向集合的第一條記錄地址,fetch的第一個(gè)作用就是將該指針指向的記錄返回。2、將指針移動后一條記錄的地址。所以可以通過循環(huán)這個(gè)光標(biāo)來返回集合中所有的記錄。
舉例:通過光標(biāo)打印所有員工姓名和工資,定義光標(biāo)規(guī)范,盡量把fetch后的變量和光標(biāo)定義在一塊。這里需要注意into后面字段的順序要和查詢語句的返回字段順序一一對應(yīng)。
判斷光標(biāo)中是否還有數(shù)據(jù)語法:這里需要了解光標(biāo)的屬性。
光標(biāo)的屬性:總共有四個(gè)屬性。1、%found它代表如果fetch取到值,它的值就為true,否則就為false。2、%notfound它代表與第一種相反的意思。
查看全部 -
PL/SQL光標(biāo)的引入:如圖,在Java中如果想要循環(huán)select查詢結(jié)果集合中的每一個(gè)數(shù)據(jù),可以通過ResultSet,通過對象的next()方法,遍歷集合中每一個(gè)數(shù)據(jù)。光標(biāo)的作用就是這樣子的。
查看全部 -
PL/SQL循環(huán)語句的使用
第一種循環(huán)語句形式:當(dāng)條件滿足total<=25000時(shí),執(zhí)行LOOP和END LOOP之間的循環(huán)體,不滿足時(shí)退出循環(huán)。
舉例:注意,PL/SQL中沒有++這種自增運(yùn)算符。
第二種循環(huán)語句形式:如果滿足when后面的條件,則跳出循環(huán)體。不滿足則執(zhí)行循環(huán)體。
舉例:如圖。
第三種循環(huán)語句形式: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語句的使用(語句序列DML語句)
第一種IF語句形式,如圖。
第二種IF語句形式,如圖。
第三種IF語句形式,如圖。
舉例:判斷用戶從鍵盤輸入的數(shù)字。1、如何使用if語句。2、如何接受一個(gè)鍵盤的輸入(鍵盤輸入的都是字符串)。
查看全部 -
引用型變量:其中my_name表示變量名,emp表示員工表,ename表示員工名字段,整句代表引用emp表的ename字段類型作為該變量的類型。
引用型變量優(yōu)勢:它會隨著參考類型改變而改變。
舉例:注意在PL/SQL中,賦值有兩種方式,一種是:=,另一種是使用into關(guān)鍵字,oracle中的dbms_output包的put_line參數(shù)中的連接符||。
記錄型變量:取表中一行變量的類型作為變量的類型,可以理解記錄型變量為數(shù)組,數(shù)組中的每一個(gè)元素就代表這一行的每一列,如果要引用其中某一列,可以通過——》變量名.字段名
舉例:
查看全部 -
PL/SQL的完整程序結(jié)構(gòu)
變量的定義語法:如圖,需要注意的是變量名稱放在類型前,賦值使用:=。
舉例:這里可以使用sysdate來獲取當(dāng)前時(shí)間。
查看全部 -
PL/SQL(Procedure Language/SQL):Oracle對sql語言的過程化擴(kuò)展,指在SQL命令語言中增加了過程處理語句。例如:分支、循環(huán)等,使SQL語言具有過程處理能力,PL/SQL是面向過程的語言。
如下這種方式,就需要使用PL/SQL來實(shí)現(xiàn)。
查看全部 -
學(xué)習(xí)PL/SQL作用
1、對oracle的一個(gè)擴(kuò)展。
例如:漲工資,可以通過java使用jdbc來操作,這里可以通過調(diào)用PL/SQL來操作,它的效率是操作oracle數(shù)據(jù)庫最高的,相比其他語言。
2、它是學(xué)習(xí)存儲過程、自定義函數(shù)、觸發(fā)器的基礎(chǔ)。
舉例:簡單的PL/SQL例子,它以declare開頭代表聲明。接下來是說明,它是一個(gè)程序,所以它會有變量,光標(biāo),例外,這里指對他們的聲明。程序以begin開始,end;結(jié)束,中間是程序體。(dbms_output是PL/SQL提供的程序包,這個(gè)程序包中提供了很多的方法,其中put_line()它是一個(gè)存儲過程,它的作用是接受一個(gè)字符串打印在屏幕上)。最后需要/,代表退出編輯環(huán)境,并且執(zhí)行PL/SQL程序。此時(shí)還需要一個(gè)操作,因?yàn)槟J(rèn)oracle的輸出開關(guān)是關(guān)閉的,通過set serveroutput on打開輸出開關(guān)。這里的/代表執(zhí)行上一條SQL語句或者上一條PL/SQL程序。
注意:如果程序沒有說明部分那么前面的declare可以不寫。
Oracle中包的位置,可以通過查看文檔了解包的用途。
其中第一個(gè)表示Oracle數(shù)據(jù)庫中提供了哪些程序包,第二個(gè)相當(dāng)于語法手冊,代表怎么使用。
拉到最下方可以看到oracle10g中提供了198個(gè)程序包。
而dbms這個(gè)包是第68個(gè)可以查看它的overview概述,它還提供了一些examples,還可以查看這個(gè)程序包中有哪些子程序,像put_line這個(gè)存儲過程,通過它可以了解每一個(gè)包的詳細(xì)用法。
在命令行中直接使用命令(desc?包名)查看包的結(jié)構(gòu),這種形式查看更為簡潔。
put_line它是一個(gè)存儲過程,需要一個(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ù)庫
查看全部
舉報(bào)