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語句的性能。
四、下降了網絡的通信量。
缺點:
一、移植問題,不一樣的數據庫存儲過程語法不一樣。
二、從新編譯問題。更改有依賴的存儲過程也會從新編譯。
三、需求變動的問題。