/*
6、函數
create [or replace] function 函數名
([p1,p2...pn])
return datatype
is/as
--聲明部分
begin
--PL/SQL程序塊
end
*/
--6.1 無參數類型 函數名後不接() 返回10以內的隨機整數
create or replace function fun1
return number
is
randnum number;
begin
randnum := mod(abs(dbms_random.random),10);--產生10以內的隨機數
return randnum;
end;
/
select fun1 from dual;--使用函數
select fun1+10 from dual;--使用函數
drop function fun1;--刪除函數fun1
--6.2.1 有參數類型 只有輸入(in)類型參數
create or replace function fun2(
num1 in number,
num2 in number
)
return number
is
sumnum number;
begin
sumnum:=num1+num2;
return sumnum;
end;
/
select fun2(10,20) from dual;--使用函數
drop function fun2;--刪除函數fun2
--6.2.2 有參數類型 【推薦先學習存儲過程】 有輸入(in)類型參數 有輸出(out)類型參數 (彌補return數據只能有一個的不足)
create or replace function fun3(
num1 in number,
num2 in number,
sumnum out number
)
return number
is
begin
sumnum:=num1+num2;
return sumnum;
end;
/
declare
sumnum number;
resultnum number;--調用函數 需要定義變量接收返回值
begin
resultnum := fun3(num1 => 10,
num2 => 20,
sumnum => sumnum);--調用函數
dbms_output.put_line('sumnum='||sumnum);
dbms_output.put_line('resultnum='||resultnum);
end;
/
drop function fun3;--刪除函數fun3
--6.2.3 有參數類型 【推薦先學習存儲過程】 有輸入(in)類型參數 有輸出(out)類型參數 有輸入輸出(in out)類型
create or replace function fun4(
num1 in number,
num2 in number,
sumnum out number,
sumnuminout in out number
)
return number
is
begin
--sumnum:=num1+num2+sumnum;--錯誤寫法 out 類型的參數無法接收輸入 in out類型的參能接收輸入
sumnum:=num1+num2;--正確寫法
sumnuminout:=num1+num2+sumnuminout;
return sumnum;
end;
/
declare
pls_sumnum number:=10;
pls_sumnuminout number:=10;
resultnum number;--調用函數 需要定義變量接收返回值
begin
resultnum := fun4(num1 => 10,
num2 => 10,
sumnum => pls_sumnum,
sumnuminout => pls_sumnuminout);--調用函數
dbms_output.put_line('pls_sumnum='||pls_sumnum);
dbms_output.put_line('pls_sumnuminout='||pls_sumnuminout);
end;
/
drop function fun4;--刪除函數fun4
/*
7、存儲過程
create [or replace] procedure 過程名
( p1 in|out datatype,
p2 in|out datatype,
...
pn in|out datatype
) is/as
....--聲明部分
begin
....--過程體
end;
作用:
1、降低總體開發成本:不熟悉業務的開發者只需要調用過程,不需要了解業務。
2、增加數據的獨立性:當發生表結構修改,不需要修改調用程序,只需要修改存儲過程。
3、提高性能:不需要多次連接數據庫。
*/
--7.1 無參數存儲過程 無參()可以省略 可以保留 將emp表中的全部員工工資加1000,然後展示員工姓名和工資
create or replace procedure pro1
as
--變量聲明區域 暫時沒有使用
begin
dbms_output.put_line('修改之前的數據如下:');
for emprow in (select * from emp) loop
dbms_output.put_line(emprow.ename||':'||emprow.sal);
end loop;
update emp set sal=(sal+100);
dbms_output.put_line('修改之後的數據如下:');
for emprow in (select * from emp) loop
dbms_output.put_line(emprow.ename||':'||emprow.sal);
end loop;
rollback;--回滾數據
end;
/
exec pro1();--執行存儲過程
drop procedure pro1;--刪除存儲過程
--7.2.1 有參數存儲過程 in 傳入dept編號,將對應dept的員工 工資加1000
create or replace procedure pro2(
pls_deptno in number--添加pls前綴跟列名區分
)
as
--變量聲明區域 暫時沒有使用
begin
dbms_output.put_line('修改之前的數據如下:');
for emprow in (select * from emp where deptno = pls_deptno) loop
dbms_output.put_line(emprow.ename||':'||emprow.sal);
end loop;
update emp set sal=(sal+100);
dbms_output.put_line('修改之後的數據如下:');
for emprow in (select * from emp where deptno = pls_deptno) loop
dbms_output.put_line(emprow.ename||':'||emprow.sal);
end loop;
rollback;--回滾數據
end;
/
exec pro2(10);--執行存儲過程
drop procedure pro2;--刪除存儲過程
--7.2.2 有參數存儲過程 in,out,in out 傳入dept編號,將對應dept的員工 工資加1000
--這個案例主要用於對比 out 和 in out 的差別,真實生產不要用out作爲輸入項
create or replace procedure pro2(
pls_deptno in number,--添加pls前綴跟列名區分
pls_sumsal out number,
pls_sumsalinout in out number
)
as
--變量聲明區域 暫時沒有使用
begin
pls_sumsal:=0;--設置out類型的默認值 否則無法計算
dbms_output.put_line('修改之前的數據如下:');
for emprow in (select * from emp where deptno = pls_deptno) loop
dbms_output.put_line(emprow.ename||':'||emprow.sal);
pls_sumsal:=pls_sumsal+emprow.sal;--求和
pls_sumsalinout:=pls_sumsalinout+emprow.sal;--求和
end loop;
update emp set sal=(sal+100);
dbms_output.put_line('修改之後的數據如下:');
for emprow in (select * from emp where deptno = pls_deptno) loop
dbms_output.put_line(emprow.ename||':'||emprow.sal);
end loop;
rollback;--回滾數據
end;
/
declare
pls_deptno number:=10;
--pls_sumsal number:=0; -- 錯誤寫法 out 類型 不能設置默認值
pls_sumsal number;
pls_sumsalinout number:=0;
begin
pro2(pls_deptno,pls_sumsal,pls_sumsalinout);--執行存儲過程
dbms_output.put_line('pls_sumsal='||pls_sumsal);
dbms_output.put_line('pls_sumsalinout='||pls_sumsalinout);
end;
/
drop procedure pro2;--刪除存儲過程