Oracle基礎 存儲過程

1、子程序sql

  子程序是已命名的PL/SQL塊,它們存儲在數據庫中,能夠Wie它們指定參數,能夠從任何數據庫客戶端和應用程序中調用它們。子程序包括存儲過程和函數。數據庫

  子程序包括:express

  一、聲明部分:聲明部分包括類型、遊標、常量、變量、異常和嵌套子程序的聲明。這些項都是局部的,在退出後就不復存在。安全

  二、可執行部分:可執行部分包括賦值、控制執行過程以及操縱ORacle數據的語句。網絡

  三、異常處理部分:  異常處理部分包括異常處理程序,負責處理執行存儲過程當中出現的異常。模塊化

 

  子程序的有點:函數

  一、模塊化:經過子程序,能夠將程序分解爲可管理的、明確的邏輯模塊。性能

  二、可重用性:子程序在建立並執行後,就能夠再任意數目的應用程序中使用。spa

  三、可維護性:子程序能夠簡化維護操做,由於若是一個子程序受到影響,則只需修改該子程序的定義。命令行

  四、安全性:用戶能夠設置權限,使得訪問數據的惟一方式就是經過用戶提供的存儲過程和函數。不只可讓數據更安全,並且能夠保證它的正確性。

 

2、存儲過程

  存儲過程是執行某些操做的子程序,是執行特定任務的模塊。從根本上講,存儲過程就是明明的PLSQL塊,它能夠被賦予參數,存儲在數據庫中,而後由一個應用程序或其餘PLSQL程序調用。

  一、建立存儲過程:

  語法:

  CREATE [OR REPLACE] PROCEDURE procedure_name

  [(paraameter_list)]

  {IS/AS}

  [local_declarations]

  BEGIN

    executable_statements;

    [EXCEPTION]

    [exception_handlers]

  END [procedure_name]

  說明:

  procedure_name:爲存儲過程的名字;

  paraameter_list:參數列表,參數中可使用in和out表示輸入和輸出參數。可選

  AS表示其餘變量聲明,IS表示顯示遊標聲明

  local_declarations:局部聲明,可選

  executable_statements:可執行語句

  exception_handlers:異常處理語句,可選

  OR REPLACE:可選。若是不包含,建立存儲過程若是存在會報錯,包含存在會替換。

  例:添加員工信息  

--添加員工信息
create or replace procedure add_emp(
eno number,
ename varchar2,
job varchar2,
mgr NUMBER,
salary number,
hiredate DATE,
com NUMBER,
dno number) 
is
BEGIN
  dbms_output.put_line('添加員工信息');
  INSERT INTO emp VALUES(eno,ename,job,mgr,hiredate,salary,com,dno);
  EXCEPTION 
    WHEN OTHERS THEN
      dbms_output.put_line('添加員工失敗');
end add_emp;

  注意:

  存儲過程當中只聲明類型,不指定長度。

  AS後的變量聲明以;結束。

  

  二、調用存儲過程:  

  語法:

  exec[ute] procedure_name (parameters_list);

  說明:

  execute:執行命令,能夠縮寫爲exec。

  procedure_name:存儲過程的名稱。

  parameters_list:存儲過程的參數列表。c

  

  調用存儲過程有兩種方式,命令行方式和PL/SQL方式。

  1)命令行方式:打開命令行直接輸入存儲過程名稱進行調用。  

EXEC ADD_EMP(8888,'zhangsan','clerk',7902,2000,SYSDATE,500,30);

 

  2)PLSQL方式:必須在pl/sql塊中調用存儲過程,不使用EXEC關鍵字,直接存儲過程名稱便可。

BEGIN
    --PL/SQL方式,不須要使用exec
    add_emp(8989,'LISI','clerk',7902,1000,SYSDATE,NULL,30);
END;

 

  參數的傳遞方式:

  1)按位置傳遞:

  按照參數的書序,依次寫入參數內容。調用的參數順序和定義的參數順序必須一一對應。  

EXEC ADD_EMP(8888,'zhangsan','clerk',7902,2000,SYSDATE,500,30);

 

  2)按名稱傳遞:

  按名稱調用時按名稱對應,名稱對應的關係最重要,次序不重要。  

EXEC add_emp(ENO => 8989,ENAME => 'LISI',JOB => 'clerk',MGR => 7902,SALARY => 1000,HIREDATE => SYSDATE,COM => NULL,DNO => 30);

  

  3)混合方式傳遞:

  同時使用位置傳遞和參數傳遞,採用這種方式必須將位置參數放在名稱參數的前面,只要第一個採用了名稱傳遞法,後面全部的參數必須使用名稱傳遞法。  

EXEC add_emp(8989,'LISI',JOB => 'clerk',MGR => 7902,SALARY => 1000,HIREDATE => SYSDATE,COM => NULL,DNO => 30);

 

  

  三、存儲過程的參數模式:

  存儲過程參數有三種模式:IN、OUT和IN OUT,即輸入、輸出、輸入/輸出。

  定義存儲過程參數語法:

  parameter_name [IN|OUT|IN OUT] dateType [{:= | default} expression]

  注意:

  1)參數IN模式是默認模式。若是未指定參數模式,則默認爲IN。對於OUT和IN OUT參數,必須明確指定。

  2)能夠再參數列表中爲IN參數指定默認值,OUT和IN OUT不可用。

  帶OUT參數的存儲過程:

  例:根據empno查詢員工信息返回。  

CREATE OR REPLACE PROCEDURE QUERY_EMP(
  V_EMPNO IN EMP.EMPNO%TYPE,       --輸入參數
  V_ENAME OUT EMP.ENAME%TYPE,      --輸出參數
  V_SAL   OUT EMP.SAL%TYPE) IS     --輸出參數
BEGIN
  SELECT ename,sal INTO v_ename,v_sal FROM emp
  WHERE empno = v_empno;
  dbms_output.put_line('數據已查到');
END QUERY_EMP;

  調用帶輸出參數的存儲過程,首先定義兩個變量保存輸出參數返回的內容。  

DECLARE 
  v_name emp.ename%TYPE;
  v_sal emp.sal%TYPE;
BEGIN
  query_emp(7788,v_name,v_sal);
  dbms_output.put_line('name:'||v_name||'  sal:'||v_sal);
END;

 

  帶IN OUT參數的存儲過程:

  數據交換;

CREATE OR REPLACE PROCEDURE swap(
  v_num1 IN OUT NUMBER,
  v_num2 IN OUT NUMBER
)
AS
  v_temp NUMBER;
BEGIN
  v_temp := v_num1;
  v_num1 := v_num2;
  v_num2 := v_temp;
END;
--調用
DECLARE
  v_n1 NUMBER := 10;
  v_n2 NUMBER := 20;
BEGIN
  swap(v_n1,v_n2);
  dbms_output.put_line(v_n1||'    '||v_n2);
END;

 

   四、存儲過程的訪問權限

  存儲過程建立後,只有建立該存儲過程的用戶和管理員纔能有權執行。其餘用戶若是要調用該存儲過程,須要獲得存儲過程的EXECUTE權限。

  例:

--將swap的執行權限授予user1
GRANT EXECUTE ON swap TO user1;   

--將swap的執行權限授予user1,而且user1能夠對其餘用戶進行受權。
GRANT EXECUTE ON swap TO user1 WITH GRANT OPTION;  

--撤銷user1用戶的執行swap權限。
REVOKE EXECUTE ON swap FROM user1   

 

  五、刪除存儲過程  

DROP procedure swap;

 

3、總結:

  優勢:

  一、存儲過程加強了PL-SQL的功能和靈活性。

  二、存儲過程保證了數據的完整性和安全性。

  三、提升了sql語句的性能。

  四、下降了網絡的通信量。

  缺點:

  一、移植問題,不一樣的數據庫存儲過程語法不一樣。

  二、從新編譯問題。更改有依賴的存儲過程也會從新編譯。

  三、需求變動的問題。

相關文章
相關標籤/搜索