六、儲存函式和過程
oracle提供可以吧pl/sql程式儲存在資料庫中,並可以在任何地方來執行它。這樣就叫儲存過程或函式。
過程和函式的唯一區別就是函式總向呼叫者返回資料,而過程則不返回資料。
例:獲取某部門的工資總和
create or replace function get_salary(
dep_id employees.department_id%type,
emp_count out number)
return number
isv_sum number;
begin
select sum(salary),count(*) into v_sum,emp_count
from employees
where department_id = dep_id;
return v_sum;
exception
when no_data_found then
dbms_output.put_line('您需要的資料不存在');
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;
執行該函式:
declare
v_num number;
v_sum number;
begin
v_sum := get_salary(80,v_num);
dbms_output.put_line('80號部門的工資總和:'||v_sum||', 人數:'||v_num);
end;
函式宣告時定義的引數成為形式引數,應用程式呼叫時為函式傳遞的引數為實際引數。
函式傳遞引數方法:位置表式法、名稱表式法、混合表式法。
實際引數和形式引數之間的資料傳遞有兩種方法:傳址法和傳值法。
傳址法:指在呼叫函式時,將實際引數的位址指標傳遞給形式引數,使形式引數和實際引數指向記憶體中的同一區域,從而實現引數資料的傳遞。這種方法又稱作參照法,即形式引數參照實際引數資料。輸入引數均採用傳址法傳遞引數。
傳值法:指將實際引數的資料拷貝到形式引數,而不是傳遞實際引數的位址。預設時,輸出引數和輸入/輸出引數均採用傳值法。在函式呼叫時,oracle將實際引數資料拷貝到輸入/輸出引數,而當函式正常執行退出時,又將輸出形式引數和輸入/輸出形式引數資料拷貝到實際引數變數中。
create or replace procedure query_emp(
v_empid employees.employee_id%type,
v_name out employees.last_name%type,
v_sal out employees.salary%type)
isbegin
select last_name,salary into v_name,v_sal
from employees
where employee_id = v_empid;
dbms_output.put_line('員工號為:'||v_empid||'的員工已經找到');
exception
when no_data_found then
dbms_output.put_line('您需要的資料不存在');
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;
呼叫方法:
declare
v1 employee.last_name%type;
v2 employee.salary%typ;
begin
query_emp(200,v1,v2);
dbms_output.put_line('姓名:'||v1||',工資:'||v2);
query_emp(201,v1,v2);
dbms_output.put_line('姓名:'||v1||',工資:'||v2);
end;
在建立儲存工程時,可使用authid current_user或authid definer選項,以表明在執行該過程時oracle使用的許可權:
1)、如果使用authid current_user選項建立乙個過程,則oracle用呼叫該過程的使用者許可權執行該過程。為了成功執行該過程,呼叫者必須具有訪問該儲存過程體中引用的所有資料庫物件所必須得許可權。
2)、如果用預設的authid definer選項建立過程,則oracle使用過程所有者的特權執行該過程。為了成功執行該過程,過程的所有者必須具有訪問該儲存過程體中引用的所有資料庫物件所必須得許可權。想要簡化應用程式使用者的特權管理,在建立儲存工程時,一般選擇authid definer選項---這樣就不必授權給需要呼叫的此過程的所有使用者了。
開發儲存過程步驟:
1)、使用文字編輯處理軟體編輯儲存過程原始碼;
2)、在sqlplus或用除錯工具將儲存過程程式進行解釋;如:sql>start c:\stat1.sql
3)、除錯原始碼直到正確;(使用show error命令來提示原始碼錯誤的位置;使用user_errors資料字典來檢視各儲存過程的錯誤位置)
4)、授權執行權給相關的使用者或角色;(grant execute on dbms_job to public with grant option)
5)、與過程相關資料字典;(user_source,all_source,dba_source,user_errors)(describe procedure_name檢視過程的名字及其引數)
6)、刪除過程和函式;(drop procedure [user.]procedure_name; drop function [user].function_name)
PL SQL 學習筆記 5 表(table)
pl sql中的表類似於c語言中的陣列。1.定義表型別的語法如下 type tabletype is table of type index by binary integer type是預定義的標量的型別,或者是通過 type指向標量的型別的引用。乙個簡單的例子 type t chartable ...
PLSQL程式設計 儲存過程
1.在開發程式中,為了乙個特定的業務功能,會向資料庫進行多次連線關閉連線 連線和關閉資料庫是很耗費資源的 需要對資料庫進行多次i o讀寫,效能比較低。如果把這些業務放到plsql中,在應用程式中只需要呼叫plsql就可以做到連線關閉一次資料庫就可以實現我們的業務,可以大大提高效率。2.oracle官...
PL SQL學習筆記
from ebs pl sql儲存過程報表輸出 1.fnd file.put line fnd file.log,l err idx 從mes表獲取tool id tool.tool id 出現異常錯誤!2.fnd file.put line fnd file.output,文字輸出內容.獲取物件結...