Oracle學習第三天

PL/SQL

1.pl/sql的作用和第一個pl/sql程序
declare
--說明部分(變量,光標或者例外)
begin
--程序體
dbms_output.put_line("Hello World");
end;
/(/:退出編輯行並且執行程序)
注:如果沒有說明部分declare可以不寫 程序從begin開始
set serveroutput on(打開輸出開關)
2.pl/sql簡介(面向過程)
pl/sql(procedure language/SQL)
plsql是Oracle對sql語言過程化的擴展(指在sql命令語言中增加了過程處理語句(如分支、循環等),使得sql語言具有過程處理能力)
3.pl/sql的程序結構
①變量類型vhar,varchar2,date,number,boolean,long
注意:pl/sql中定義變量時  名稱在前邊類型在後邊。 賦值使用:=而不是=,也可以使用into;(sysdate:當前的日期)
②引用型變量
例:my_name emp.ename%type;(引用emp表中的ename字段的類型作爲my_name的類型)

注:連接符是||;
例:
--引用型變量
set serveroutput on

declare
--定義引用型變量:查詢並打印7839的姓名和薪水
--pname varchar2(20)
--psal number
pename emp.ename%type;
psal emp.sal%type;
begin
--得到7839的姓名和薪水
select ename,sal into pename,psal from emp where empno=7839;
--打印姓名和薪水
dbms_output.put_line(pename||'的薪水是||psal';);
end;
/
③記錄型變量
emp_rec emp%rowtype (一行的類型給變量 相當於數組)
--使用記錄型變量,查詢並打印7839的姓名和薪水
set serveroutput on
declare
--定義記錄型變量:注意代表一行
emp_rec emp%rowtype
--得到7839一行的信息
select * into emp_rec from emp where empno=7839;
--打印姓名和薪水
dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);
end;
/
4.pl/sql中if語句的使用

if 條件 then 語句1;
語句2;
end if;

if 條件 then 語句序列1;
else 語句序列2;
end if;

if 條件 then 語句;
elsif 語句 then 語句;
else 語句;
end if;
例:
--判斷用戶從鍵盤輸入的數字
--1.如何使用if,2.接收一個鍵盤輸入(字符串)
set serveroutput on
--接收一個鍵盤的輸入
--num:地址值,含義是:在該地址保存了輸入的值
accept num prompt '請輸入一個數字'
declare
--定義變量保存用戶從鍵盤輸入的數字
pnum number:=#
begin
--執行if語句進行條件判斷
if pnum=0 then dbms_output.put_line('領輸入的數字是0');
elsif pnum=1 then dbms_outpt.put_line('您輸入的數組是1')
else dbms_output.put_line('其他數字';)
end if;
end;
/
5. 循環的使用

while total<=250 loop
...
total:=total+salary;
end loop;


例:
--使用while循環打印數字的1-10
set serveroutput on

declare
--定義循環變量
pnum number:=1;
begin
while pnum<=10 loop
dbms_output.put_line(pnum);
--使該變量+1
pnum:=pnum+1;
end loop;
end;
/

loop
exit[when 條件];
...
end loop;

例:
--使用loop打印數字的1-10
set serveroutput on
declare
--定義循環變量
pnum number:=1;
begin
loop
--退出條件:循環變量大於10
exit when pnum>10;
--打印該循環變量
dbms_output.put_line(pnum);
--循環變量+1
pnum:=pnum+1;
end loop;
end;
/

for i in 1..3 loop
語句序列;
end loop;


例:
--使用for循環打印數字1-10
set serveroutput on
declare
--定義循環變量
pnum number:=1;
begin
for pnum in 1..10 loop
dbms_output.put_line(pnum);
end loop;
end;
/
6.pl/sql光標的引入
①光標的語法
cursor 光標名[(參數名 數據類型[,參數名 數據類型])]
is select 語句


-open 光標名(打開光標)
-fetch c1 into pename;(取一行到變量中,1.把當前指針指向的記錄返回。2將指針指向下一條記錄)
-close 光標名(關閉光標)

光標的屬性
%found
%notfound


例:
--查詢並打印員工的姓名和薪水
set serveroutput on
declare
--定義個光標
cursor cemp is select ename,sal from emp;
--爲光標定義對應的變量
pename emp.ename%type;
psal emp.sal%type;
begin
--打開光標
open cemp;
loop
--取一條記錄
fetch cemp into pename,psal;
--思考:1.循環什麼時候退出2fetch不一定能取到記錄
--exit when 沒有記錄;
exit when cemp%notfound;
--打印
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--關閉光標
close cemp;
end;
/


②實例
--給員工漲工資
set serveroutput on
declare
--定義光標代表給哪些員工漲工資
cursor cemp is select empno,empjob from emp;
penpno emp.empno%type;
pjob emp.empjob%type;
begin
--打開光標
open cemp;
loop
--取出一個員工
fetch cemp into pempno,pjob;
exit when cemp%notfound;
--判斷員工的職位
if pjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
elsif pjob='ANAGER' then update emp set sal=sal+800 where empno=pempno;
else update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
--關閉光標
close cemp;
--對於oracle,默認的事務隔離級別是red cmomitted
--事務的acid(原子性,一致性,隔離性,持久性)
commit;


end;
/
③pl/sql光標的屬性和限制
屬性:%found %notfound
%isopen:判斷光標是否打開
%rowcount:影響的行數
限制:默認情況下oracle數據庫只運行在同一個會話中打開300個光標。
修改光標的限制
alter system set open_cursor=400 scope=both;
socpe的取值:both,memory,spfile(數據庫需要重啓)
④帶參數的光標
cursor 光標名[(參數名 數據類型[,參數名 數據類型])]
is select 語句
--查詢某個部門中員工的姓名
set serveroutput on
declare
--定義帶參數的光標
cursor cemp(dno number)is select ename from emp where deptno=dno;
pename emp.ename%type;
begin
--打開光標
open cemp(10);
loop
--取出每個員工的姓名
fetch cemp into pename
exit when cemp%notfound;
dbms_output.put_line(pename)
end loop;
close cemp;
end;
/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章