pl/sql(procedure language/sql)是oracle對sql語言的過程化擴充套件,在sql命令語言中增加了過程處理語句(如分支、迴圈等),使sql語言具有處理過程的能力。所以pl/sql是面向過程的語言。對於其他的資料庫也有其對應的過程擴充套件語言,例如db2的sql/pl,sql server的transac-sql(t-sql)。
declare
說明部分(變數說明、游標說明、例外申明)
begin
語句序列(dml語句)
exception
例外處理語句
end;
/
如果沒有說明部分,declare可以不需要。
變數可以分為基本型別變數,引用型變數和記錄型變數。變數的賦值使用「:=」或者在sql語句中使用「into」。
基本變數型別有char, varchar2, date, number, boolean, long。
pnumber number(7,2) //定義乙個number型別變數,7表示小數點前保留7位,2表示保留兩位小數
pname varchar2(20) //定義乙個長度為20的varchar2型別變數
pdate date //定義乙個date型別變數
pnumber := 1; //賦值
pdate := sysdate; //賦值
select ename into pname from emp where empno = 7839; //使用into賦值ename, empno為欄位名, emp為表名
引用型變數為引用表中的字段的型別,如
pname emp.ename%type; //定義乙個引用型變數
這表示定義了乙個變數「pname」,這個變數的型別和emp表中ename欄位的資料型別是一樣的。
記錄型變數記錄表中的一行資料
emp_rec emp%rowtype; //定義乙個記錄型變數
emp_rec.ename := 'adams'; //引用記錄型變數,並把adms賦值給記錄中的ename欄位
select * into emp_rec from emp where empno=7839; //使用into給emp_rec賦值
「emp_rec」代表變數名,emp為表的名字,「ename」為emp表中的乙個字段。
if語句
if 條件 then 執行語句;
end if;
if 條件 then 執行語句;
else 執行語句;
end if;
if 條件 then 執行語句;
elsif 條件 then 執行語句;
else 執行語句;
end if;
迴圈語句
while 條件 loop
執行語句;
end loop;
loop
exit [when 條件];
執行語句;
end loop;
for 變數 in 範圍(如1…3) loop
執行語句;
end loop;
游標(cursor),也稱游標,作為集合儲存多個值。
游標屬性: %found, %notfound,%isopen,%rowcount(影響的行數,而不是總行數,如取到第十行的值時,rowcount即為10)
游標的數量限制:oracle資料庫只允許同乙個會話中,預設有限個數的游標被開啟,一般為300。可在sys使用者下使用show parameter cursor 看到cursor相關的引數,open_cursors即為預設開啟的游標數。「alter system set_open_cursors=400 scope=both;」可以更改預設游標數,這裡改為了400。
游標的定義:
cursor 游標名 [(引數名 資料型別[, 引數名 資料型別]…)] is select 語句
cursor c1 is select ename from emp;
open c1; //開啟游標執行語句
fetch c1 into pename; //取一行資料到變數中, 嵌入迴圈中可取每一行資料
close c1; //關閉游標釋放資源
cursor c2 is select ename, sal from emp; //不帶引數的游標的宣告
cursor cemp(dno number) is select ename from emp where deptno = dno; //帶引數的游標的宣告
open cemp(10); //開啟帶引數的游標時傳遞引數進去
...close cemp;
異常分為系統異常和使用者自定義異常。系統異常包括:
no_data_found
沒有找到資料
too_many_rows
select…into語句匹配多個行
zero_divide
被零除value_error
算術或型別轉換錯誤
timeout_on_resource
在等待資源時發生超時
異常處理語句結構
exception
when 異常(no_data_found) then 異常處理語句;
when others(其他異常) then 異常處理語句;
盡量捕獲並處理所有的異常,否則直接拋給系統的話,會增加系統負擔。
自定義異常:在declare部分定義乙個變數,其型別為exception,在執行語句中使用raise關鍵字拋出自定義異常,並在exception部分處理該異常。
/*
以scott使用者下的表為例
統計每年入職的員工人數,即1980,1981,1982,1987四年每年的入職人數
*/set serveroutput on;
declare
--每一位員工入職的年份
cursor cemp is select to_char(hiredate, 'yyyy') from emp;
--年份
phiredate varchar2(5);
--員工入職人數
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;
begin
--開啟游標
open cemp;
loop
--取員工入職年份
fetch cemp into phiredate;
--退出條件,這裡使用了游標的notfound屬性
exit when cemp%notfound;
--根據年份計算數量
if phiredate = '1980' then count80 := count80 + 1;
elsif phiredate = '1981' then count81 := count81 + 1;
elsif phiredate = '1982' then count82 := count82 + 1;
else count87 := count87 + 1;
end if;
end loop;
--關閉游標
close cemp;
--輸出結果
dbms_output.put_line('四年總入職人數:' || (count80 + count81 + count82 + count87));
dbms_output.put_line('1980: ' || count80);
dbms_output.put_line('1981: ' || count81);
dbms_output.put_line('1982: ' || count82);
dbms_output.put_line('1987: ' || count87);
end;
/
輸出結果為:
四年總入職人數:14
1980: 1
1981: 10
1982: 1
1987: 2
PL SQL 游標變數
start 游標變數非常有用,游標變數可以在不同的儲存過程中傳遞,也可以返回給客戶端。create table student id int not null,name varchar2 30 not null,class varchar2 10 insert into student values...
oracle基礎 pl sql的游標
result set 結果集 在pl sql中使用游標代表乙個 集合 定義 cursor 游標名 引數名 資料型別 eg cursor c1 is select name from test 定義了乙個游標c1,該內容是所有名稱name的集合 found 是游標取到值為真 notfound 是游標沒...
Oracle筆記,PL SQL簡單語句塊 變數定義
1 簡單sql語句,hellworld示例 輸出資訊begindbms output.put line oracle hello world end 2 變數的定義 使用 定義變數declaresname varchar2 20 beginsname jack dbms output.put lin...