1. 子程序:
子程序是已命名的PL/SQL塊,可帶參數並可從調用環境中進行調用.與未命名或匿名PL/SQL塊一樣,
子程序具有聲明部分,可執行部分和可選的異常處理部分;
子程序的優點:
l 模塊化: 通過子程序,可以將程序分解爲可管理的,明確的邏輯模塊.
l 可重用性: 子程序在創建並執行後,就可以在任意數目的應用程序中使用;
l 可維護性: 子程序可以簡化維護操作,因爲如果一個子程序受到影響,則只需修改該子程序的定義
1.1開發存儲過程
1)建立帶參或者不帶參的存儲過程
例如:
create or replace procedure find(e_sal number) --建立過程
is
cursor cur_emp is select ename,sal fromscott.emp where sal<=e_sal; --定義一個遊標
row_emp cur_emp%rowtype; --基於遊標定義一個記錄
begin
open cur_emp;
fetch cur_emp into row_emp;
while cur_emp%found --循環檢測遊標屬性,看是否到最後一行
loop
dbms_output.put_line(row_emp.ename||'--'||row_emp.sal);
fetch cur_emp into row_emp; --從遊標提取一行到記錄中
end loop;
close cur_emp;
end;
call find(1500); --調用find過程
2)建立帶輸出參數的存儲過程
在過程中輸出數據用OUT或IN OUT參數來完成的.
--建立帶OUT輸出參數的過程
create OR REPLACEPROCEDURE query_employee
(eno number,NAME OUTVARCHAR2,salary OUT NUMBER)
IS
BEGIN
SELECT ename , sal INTO NAME,salary FROMscott.emp WHERE empno = eno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000,'該僱員不存在');
END;
以下是在SQL*PLUS中調用該過程的示例:
SQL> var namevarchar2(10)
SQL> var salarynumber
SQL> execquery_employee(7799,:name,:salary)
beginquery_employee(7799,:name,:salary); end;
ORA-20000: 該僱員不存在
ORA-06512: 在"SYS.QUERY_EMPLOYEE", line 8
ORA-06512: 在line 1
name
---------
salary
---------
1.2開發函數
函數是一段獨立的PL/SQL程序代碼,它執行某個特定的,明確的任務.通常,函數將處理從程序的調用部分傳遞給它的信息,然後返回單個值.信息通過稱爲參數的特殊標識符傳遞給函數,然後通過return語句返回.建立函數語法如下:
Create[or replace]function function_name
(argument1[model]datatype1,
Argument2[model]datatype2,
…
)
Return datetype
is|as
PL/SQL Block;
建立函數時參數可帶可不帶,當定義參數是,如果不指定參數模式,則默認輸入參數,所以IN關鍵字既可以指定也可以不指定
示例如下:
--建立帶參的函數
create or replacefunction get_user(e_no in number)
return varchar2
is
v_user scott.emp.ename%type;
begin
select ename into v_user from scott.empwhere empno=e_no;
return v_user;
end;
--調用函數
declare
e_name scott.emp.ename%type;
begin
e_name := GET_USER(7369);
dbms_output.put_line(e_name);
end;
一般情況下,函數只需要返回單個數據.如果希望使用函數返回多個數據,就需要使用輸出參數了,以下爲建立帶OUT參數函數模式
--建立帶輸出參數的函數
create or replacefunction get_info
(NAME IN VARCHAR2,titleOUT VARCHAR2)
return varchar2
as
deptname scott.dept.dname%type;
begin
select a.job,b.dname into title,deptnamefrom scott.emp a, scott.dept b
where a.deptno = b.deptno
and upper(ename)=upper(name);
return deptname;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error(-20000,'該僱員不存在');
end;
SQL> var jobvarchar2(20)
SQL> var dnamevarchar2(20)
SQL> exec :dname:=get_info('scott',:job)
PL/SQL 過程成功完成
dname
---------
RESEARCH
job
---------
ANALYST