Oracle學習筆記第十六天
阿新 • • 發佈:2019-01-05
Oracle學習筆記第十六天
子程式
概念: 命名的PL/SQL塊,編譯並存儲在資料庫中
把編寫好的SQL程式取一個名稱,並儲存在資料庫裡面,可以通過這個名稱來呼叫這段程式。
分類:
-
過程 – 執行某些操作
2. 函式 -- 執行操作並返回值
過程
-- 建立並執行過程的語法
CREATE [OR REPLACE] PROCEDURE
<procedure name> [(<parameter list>)] --過程名、過程引數
IS|AS
<local variable declaration> --宣告變數
BEGIN
<executable statements> --執行部分
[EXCEPTION
<exception handlers>] --異常處理部分
END procedure name;
EXEC[UTE] procedure_name(parameters_list);--執行過程
`-- 舉例
---建立儲存過程
create or replace procedure
add_emp(v_empno emp.empno%type,
v_ename emp.ename% type,
v_job emp.job%type,
v_deptno emp.deptno%type
)
is
--定義異常變數
emp_null_error exception;
--將自定義的異常變數和系統的錯誤碼繫結
pragma exception_init(emp_null_error,-1400);
begin
--插入資料
insert into emp(empno,ename,job,deptno)
values (v_empno,v_ename,v_job,v_deptno);
--提交事務
commit;
exception
when emp_null_error then
dbms_output.put_line('部門編號不能為空');
end add_emp;
-- 舉例
------執行儲存過程
-----方法一:開啟命令視窗,輸入命令
execute add_emp(123,'張小三','MANAGER',10);
-----方法二:在塊中呼叫過程
set serveroutput on;
declare
begin
add_emp(124,'張小三','MANAGER',10);
end;
/
注意:異常可以不在子程式中執行,可以丟擲,如果丟擲的話有固定的輸出格式,可以用 java 接收這個異常然後處理,靈活性好。
子程式傳參可以按位置傳參,也可以使用 引數名=> 值
過程的引數模式
1. IN
- 用於接受呼叫程式的值
- 預設的引數模式
2. OUT
- 用於向呼叫程式返回值
3. IN OUT
- 用於接受呼叫程式的值,並向呼叫程式返回更新的值
注意:儲存過程使用入參時只需要指定變數型別,不能指定型別大小,否則會報錯。
過程中使用遊標
-- 語法 -- 儲存過程使用遊標型別的輸出引數
----定義過程
create or replace procedure
過程名(遊標名 out sys_refcursor)
is
begin
open 遊標名 for SQL語句;
end;
----呼叫過程
set serveroutput on;
declare
遊標名 sys_refcursor; --定義返回值的變數
資料變數名 emp.sal%type; --儲存從遊標中提取的資料
begin
過程名(遊標名); -- 呼叫過程,傳入遊標進行資料的的讀取
讀取後的其他操作。
close 遊標名; -- 關閉遊標
end;
-- 語法 -- 儲存過程使用遊標型別的輸入引數
----定義遊標
create or replace procedure
過程名(遊標名 in sys_refcursor)
is
儲存資料變數 emp.sal%type; --儲存從遊標中提取的資料
begin
loop
fetch 遊標名 into 變數; -- 從遊標中讀取資料
exit when 遊標名%notfound; -- 判斷遊標裡的值時候已經讀取完
其他操作
end loop;
close 遊標名; -- 關閉遊標
end;
----呼叫遊標
set serveroutput on;
declare
遊標名 sys_refcursor;
begin
--開啟遊標
open 遊標名 for SQL語句;
--呼叫過程
過程名(遊標名); -- 呼叫過程,傳入遊標進行資料的的讀取
end;
/
FETCH 表示提取遊標,鍵學習筆記第十二天。
-- 提取遊標
FETCH cursor_name INTO variable_list;
-- 使用FETCH語句實現對遊標內容的讀取
-- variable_list必須與從遊標提取的結果集型別相同
跨賬號執行儲存過程
意思就是A執行B賬號下的儲存過程。
這個必須要執行授權,即在B中必須給A授權。
-- 在B使用者中授權給A呼叫B建立的儲存過程
grant execute on 儲存過程名 to A使用者;
grant execute on 儲存過程名 to public;
-- 刪除授權
DROP PROCEDURE procedure_name;