1 . 什麼是pl/sql?
pl/sql是oracle對sql語言的過程化擴展,指在sql命令語言中增加了過程處理語句(如分支,循環等),使sql語言具有過程處理能力。
2 .變量
普通數據類型(char,varchar2,date,number,boolean,long)
特殊變量類型(引用類型變量,記錄型變量)
普通變量:
1. 直接複製語句 := 如:v_name='zhangsan'
2. 語句賦值,使用select...into ...賦值: (語法 select 值 into 變量)
【實例】
-- 打印個人信息,包括:姓名,薪水,地址
declare
--姓名
v_name varchar2(20) :='zhangsan';
--薪水
v_sal number;
--地址
v_address varchar2(50);
begin
-- 直接賦值
v_sal:=8000;
--語句賦值
select '貴陽市觀山湖區' into v_address from dual;
--打印輸出
dbms_output.put_line('姓名:'||v_name||',薪水:'||v_sal||',地址:'||v_address);
end;
引用型變量
變量的類型和長度取決於表中字段的類型和長度
通過表名.列名%TYPE指定變量的類型和長度,如: v_name emp.ename%TYPE;
【案例】
-- 引用型變量打印個人信息,包括:姓名,薪水, 查看emp表ename,sal賦值給定義的變量,v_name的長度,類型取決於emp.ename長度
declare
--姓名
v_name emp.ename%TYPE;
--薪水
v_sal emp.sal%TYPE;
begin
--語句賦值
select ename,sal into v_name,v_sal from emp where empno=7839;
--打印輸出
dbms_output.put_line('姓名:'||v_name||',薪水:'||v_sal);
end;
引用型的好處:
使用普通變量定義方式,需要知道表中列的類型,而使用引用類型,不需要考慮類的類型和長度,使用%TYPE是非常號的編程風格,因爲它使得PL/SQL更加靈活,更加具有對數據庫定義的更新
記錄型變量
接收表中一整行記錄,相當於java中的一個對象
語法:變量名稱 表名%ROWTYPE, 例如: v_emp emp%rowtype;
【案例】
-- 記錄型變量打印個人信息,包括:姓名,薪水
declare
--記錄型變量接收一行
v_emp emp%ROWTYPE;
begin
--語句賦值
select * into v_emp from emp where empno=7839;
--打印輸出
dbms_output.put_line('姓名:'||v_emp.ename||',薪水:'||v_emp.sal);
end;
如果有一個表,有100個字段,那麼程序如果要使用這100個字段,如果使用引用型變量一個個聲明,會特別麻煩,記錄型變量可以方便的解決這個問題
錯誤的使用;
記錄型變量只能存儲一個完整的行數據
流程控制
語法:
begin
if 條件1 then 執行1
elsif 條件2 then 執行2
else 執行3
end if;
declare
--聲明接收的數量
v_count number;
begin
select count(1) into v_count from emp;
if v_count > 20 then
dbms_output.put_line('emp表中的數量超過20條爲:' || v_count);
elsif v_count >= 10 then
dbms_output.put_line('emp表中的數量在10-20之間,條爲:' || v_count);
else
dbms_output.put_line('emp表中的數量小於10條爲:' || v_count);
end if;
end;
循環
在ORACLE中有三種循環方式,這裏只介紹一種:loop循環
語法
BEGIN
LOOP
EXIT WHEN 退出循環條件
END LOOP;
END;
【案例】
--循環打印1-10
declare
--聲明循環變量
v_num number := 1;
begin
loop
exit when v_num > 10;
dbms_output.put_line(v_num);
--循環變量的自增
v_num := v_num + 1;
end loop;
end;
無參遊標
什麼是遊標?
用於臨時存儲一個查詢返回的多行數據(結果集,類似於java的jdbc連接返回的ResultSet集合),通過遍歷遊標,可以逐行訪問處理該結果集的數據。
遊標的使用方式:聲明--->打開--->讀取--->關閉
1 . 語法
遊標聲明:
CURSOR 遊標名【參數列表】 IS 查詢語句;
遊標的打開:
OPEN 遊標名:
遊標的取值:
FETCH 遊標名 INTO 變量列表:
遊標的關閉:
CLOSE 遊標名;
2 . 遊標的屬性
遊標的屬性 返回值類型 說明
%ROWCOUNT 整型 獲得FETCH語句返回的數據行數
%FOUND 布爾型 最近的FETCH語句返回一行數據則爲真,否則爲假
%NOTFOUND 布爾型 與%FOUND屬性返回值相反
%ISOPEN 布爾型 遊標已經打開時值爲真,否則爲假
3 .創建和使用
--使用遊標查詢emp表中員工名字,工資並且打印出來
declare
--聲明遊標
cursor c_emp is
select ename, sal from emp;
--聲明變量接收遊標的數據
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
--打開遊標
open c_emp;
--遍歷遊標
loop
--獲取遊標中的數據
fetch c_emp
into v_name, v_sal;
--退出循環條件 %NOTFOUND:表示沒有數據, 則退出循環
exit when c_emp%NOTFOUND;
--輸出
dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
end loop;
--關閉遊標
close c_emp;
end;
有參遊標
--使用帶參數遊標查詢emp表中員工名字,工資並且打印出來, 如果說打開遊標傳入的參數爲10,則值查詢empno=10的所有員工
declare
--聲明遊標
cursor c_emp(v_deptno emp.empno%TYPE) is
select ename, sal from emp where deptno = v_deptno;
--聲明變量接收遊標的數據
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
--打開遊標
open c_emp(10);
--遍歷遊標
loop
--獲取遊標中的數據
fetch c_emp
into v_name, v_sal;
--退出循環條件 %NOTFOUND:表示沒有數據, 則退出循環
exit when c_emp%NOTFOUND;
--輸出
dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
end loop;
--關閉遊標
close c_emp;
end;