示例所要用到的表結構及相關數據:函數
1 SQL
>
desc emp;
2 Name Type Nullable
Default Comments
3
--
------ ------------ -------- ------- --------
4
EMPNO
NUMBER(
4)
5 ENAME
VARCHAR2(
10) Y
6 JOB
VARCHAR2(
9) Y
7 MGR
NUMBER(
4) Y
8 HIREDATE DATE Y
9 SAL
NUMBER(
7,
2) Y
10 COMM
NUMBER(
7,
2) Y
11 DEPTNO
NUMBER(
2) Y
12
13 SQL
>
select
*
from emp;
14
15 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
16
--
--- ---------- --------- ----- ----------- --------- --------- ------
17
7369 SMITH CLERK
7902
1980
/
12
/
17
880.00
20
18
7499 ALLEN SALESMAN
7698
1981
/
2
/
20
1600.00
300.00
30
19
7521 WARD SALESMAN
7698
1981
/
2
/
22
1250.00
500.00
30
20
7566 JONES MANAGER
7839
1981
/
4
/
2
2975.00
20
21
7654 MARTIN SALESMAN
7698
1981
/
9
/
28
1250.00
1400.00
30
22
7698 BLAKE MANAGER
7839
1981
/
5
/
1
2850.00
30
23
7782 CLARK MANAGER
7839
1981
/
6
/
9
2450.00
10
24
7788 SCOTT ANALYST
7566
1987
/
4
/
19
3000.00
20
25
7839 KING PRESIDENT
1981
/
11
/
17
5000.00
10
26
7844 TURNER SALESMAN
7698
1981
/
9
/
8
1500.00
0.00
30
27
7876 ADAMS CLERK
7788
1987
/
5
/
23
1100.00
20
28
7900 JAMES CLERK
7698
1981
/
12
/
3
950.00
30
29
7902 FORD ANALYST
7566
1981
/
12
/
3
3000.00
20
30
7934 MILLER CLERK
7782
1982
/
1
/
23
1300.00
10
31
32
14 rows selected
建立過程語句以下:spa
CREATE [OR REPLACE] PROCEDURE procedure_namecode
[(parameter_name [IN | OUT | IN OUT] type [, ...])]blog
{IS | AS}it
BEGINio
procedure_bodyfunction
END procedure_name;class
- OR REPLACE 說明若是過程已經存在,則替換已有的過程
- procedure_name 指定過程名。
- parameter_name 指定傳遞給過程的函數名。能夠向一個過程傳遞多個參數。
- IN | OUT | IN OUT 定義了參數的模式。每個參數均可以選擇下列模式之一:
- IN 是參數的默認模式。這種模式定義的參數在程序運行的時候已經具備值,在過程體中不能改變IN參數的值。
- OUT模式定義的參數只在過程體內部賦值。
- IN OUT模式定義的參數當過程運行是可能已經具備值,可是在過程體中也能夠修改此值。
- type指定參數的類型
- procedure_body包含過程的實際代碼。
eg: 根據傳入的員工姓名將對應員工的薪水進行調整,調整規則爲若是有傳入薪水值則以傳入值爲標準,若是沒有傳入薪水值則在原來的幅度上上漲10%,最後返回員工的boss的姓名。 基礎
1
create
or
replace
procedure procedure_demo (
2 vname
in
varchar2,
3 vbossname out
varchar2,
4 vsal
in out
number
5 )
6
as
7 v_count
number;
8
begin
9
select
count(
1)
into v_count
from emp t
where t.ename
=vname;
10
11
/*
若是輸入姓名有誤則返回
*/
12
if v_count
=
0
then
13 dbms_output.put_line(
'
輸入姓名有誤.
');
14
return;
15
end
if;
16
17
/*
若是提供了salary則將對應員工的薪水改成傳入的薪水值不然在原來的基礎上添加10%
*/
18
if vsal
is
null
then
19
update emp t
set t.sal
=t.sal
*
1.1
where t.ename
=vname;
20
else
21
update emp t
set t.sal
=vsal
where t.ename
=vname;
22
end
if;
23
24
select
case
when t2.ename
is
null
then
'
本身
'
else t2.ename
end , t1.sal
into vbossname, vsal
from emp t1, emp t2
where t1.mgr
=t2.empno(
+)
and t1.ename
=vname ;
25
26 dbms_output.put_line(
'
員工
'
|| vname
||
'
薪水是
'
|| vsal
||
'
他的boss是
'
|| vbossname);
27
28
commit;
29
30
end procedure_demo;
調用過程object
CALL procure_name(parameter1, parameter2,...);
1 SQL
>
var ina
varchar2;
2 SQL
>
var outb
varchar2;
3 SQL
>
var inoutc
number;
4 SQL
>
exec :ina :
=
'
SMITH
';
5
6 PL
/SQL
procedure successfully completed
7 ina
8
--
-------
9
SMITH
10
11 SQL
>
exec :inoutc :
=
800;
12
13 PL
/SQL
procedure successfully completed
14 inoutc
15
--
-------
16
800
17
18 SQL
> call procedure_demo(vname
=> :ina, vbossname
=> :outb, vsal
=> :inoutc);
19
20 Method called
21 ina
22
--
-------
23
SMITH
24 outb
25
--
-------
26
FORD
27 inoutc
28
--
-------
29
800
30
31 SQL
>
select
*
from emp t
where t.ename
=
'
SMITH
';
32
33 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
34
--
--- ---------- --------- ----- ----------- --------- --------- ------
35
7369 SMITH CLERK
7902
1980
/
12
/
17
800.00
20
36
刪除過程
DROP PROCEDURE procedure_name;
eg:
1
2 SQL
>
drop
procedure procedure_demo;
3
4
Procedure dropped
5
6 SQL
>
view procedure_demo;
7 Unknown object: procedure_demo
8
9 SQL
>
建立函數語句以下:
CREATE [OR REPLACE] FUNCTION fuction_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN type
{IS | AS}
BEGIN
function_body
END function_name;
- OR REPLACE表示若是函數已經存在,則替換現有的函數。
- function_name指定函數名。
- parameter_name指定傳遞給函數的參數名。
- IN | OUT | IN OUT指定參數的模式。
- type 指定參數的類型。
- function_body 包含函數的實際代碼。函數體不像過程體,它必須有返回值,其類型在RETURN子句中指定。
eg:查出emp表中的總人數。
1 create or replace function tarbitrary
return number
2
3
as
4 v_count number;
5 begin
6
select count(
1) into v_count
from emp;
7
8
return v_count;
9 end;
10 /
調用函數
select function_name([parmater1, parameter2, ...]) from dual;
1 SQL>
select tarbitrary()
from dual;
2
3 TARBITRARY()
4 ------------
5
14
刪除函數
DROP FUNCTION function_name;
1 SQL> drop function tarbitrary;
2
3 Function dropped