1. 程式人生 > >Oracle學習筆記第十六天

Oracle學習筆記第十六天

Oracle學習筆記第十六天

子程式

概念: 命名的PL/SQL塊,編譯並存儲在資料庫中

​ 把編寫好的SQL程式取一個名稱,並儲存在資料庫裡面,可以通過這個名稱來呼叫這段程式。

分類:

  1. 過程 – 執行某些操作

        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;