oracle提供可以把pl/sql程式儲存在資料庫中,並可以在任何地方來執行它。這樣就叫儲存過程或函式。儲存過程和函式統稱為pl/sql子程式,它們是被命名的pl/sql塊,均儲存在資料庫中,並通過輸入、輸出引數或輸入/輸出引數與其呼叫者交換資訊。
儲存過程和函式的唯一區別是:函式有個返回值,而儲存過程沒有。
建立函式
create or replace function 函式名(
arg1 type1, –省略標記為 in
arg2 (in,out,in out) type2 –不要加長度約束
return return_type
is|as
型別.變數的說明
begin
執行部分
exception
其他語句
end;
注意:在宣告函式時所定義的引數的型別和return後面的型別都不要加長度約束。
--無參函式
create or replace function fun1
return date
is v_date date;
begin
select sysdate into v_date from dual;
dbms_output.put_line('返回當前時間');
return v_date;
end;
執行declare
v_mydate date;
begin
v_mydate := fun1();
dbms_output.put_line(v_mydate);
end;--有參函式
--獲取某部門的工資和以及部門人數
create or replace function sumsal(
p_deptno employees.department_id%type default 90,
p_count out number
)return number
isv_sum_sal number;
begin
select sum(salary),count(*) into v_sum_sal,p_count from employees where department_id=p_deptno;
return v_sum_sal;
end;
執行declare
v_deptno number := 50;
v_sum_salary number;
v_count number;
begin
v_sum_salary := sumsal(v_deptno,v_count);
dbms_output.put_line(v_sum_salary||'---'||v_count);
v_sum_salary := sumsal(p_count => v_count);
dbms_output.put_line(v_sum_salary||'---'||v_count);
end;函式宣告時所定義的引數稱為形式引數,應用程式呼叫時為函式傳遞的引數稱為實際引數。
引數傳遞格式
位置表示法:即按照函式宣告的,依照順序將引數傳遞 名稱表示法:形式引數 => 實際引數。可以傳部分引數,而且可以不用按函式引數順序傳遞。 混合表示法:使用位置表示法所傳遞的引數必須放在名稱表示法所傳遞的引數前面。
無論是哪種傳遞格式,實際引數和形式引數之間的資料傳遞只有兩種
傳址法:將實際引數的位址指標傳遞給形式引數。輸入引數均採用傳址法傳遞資料。 傳值法:將實際引數的資料拷貝到形式引數。輸出,輸入/輸出引數均採用傳值法。
建立過程
create or replace procedure name_procedure(
arg1 type1, –省略標記為 in
arg2 (in,out,in out) type2 –不要加長度約束
is|as
型別.變數的說明
begin
執行部分
exception
其他語句
end;
create or replace procedure del_by_empno(
p_empno in emp.employee_id%type)is
no_result exception;
begin
delete from emp where employee_id = p_empno;
if sql%notfound then
raise no_result;
end if;
dbms_output.put_line('成功刪除'||p_empno||'號員工');
exception
when no_result then dbms_output.put_line('資料不存在');
when others then dbms_output.put_line(sqlcode||'---'||sqlerrm);
end;--根據id查員工name,salary
create or replace procedure get_emp_by_id(
p_empno employees.employee_id%type,
p_ename out employees.last_name%type,
p_sal out employees.salary%type)is
begin
select last_name,salary into p_ename,p_sal from employees where employee_id=p_empno;
dbms_output.put_line('員工'||p_empno||'已找到');
exception
when no_data_found then dbms_output.put_line('無此員工');
when others then dbms_output.put_line('不明原因');
end;
執行declare
v_empno employees.employee_id%type := &empno;
v_ename employees.last_name%type;
v_sal employees.salary%type;
begin
get_emp_by_id(v_empno,v_ename,v_sal);
dbms_output.put_line(v_ename||'-----'||v_sal);
end;
Oracle資料庫儲存過程和儲存函式
指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程 儲存函式。儲存過程沒有返回值。儲存函式有返回值 建立儲存過程 用create procedure命令建立儲存過程和儲存函式。語法 create or replace procedure過程名 引數列表 as plsql子程式體 儲存過程示例 為...
Oracle資料庫儲存過程
建立語句 create or replace procedure 儲存過程名 儲存過程名定義 包括儲存過程名和引數列表。引數名和引數型別。引數名不能重複,引數傳遞方式 in,out,in out in 表示輸入引數,按值傳遞方式。out 表示輸出引數,可以理解為按引用傳遞方式。可以作為儲存過程的輸出...
oracle資料庫 儲存過程
儲存過程 stored procedure 是一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。儲存過程是資料庫中的乙個重要物件,任何乙個設計良好的資料庫應用程式都應該用到儲存過程。儲存過程是由流控制和sql 語句...