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