oracle存儲過程和存儲函數(轉)

 

存儲過程html

什麼是存儲過程【procedure】?java

事先運用oracle語法,寫好的一段具備業務功能的程序片斷,長期保存在oracle服務器中

語言遠程訪問,相似於java中的函數。

爲何要用存儲過程?
(1)PLSQL每次執行都要總體運行一遍,纔有結果
(2)PLSQL不能將其封裝起來,長期保存在oracle服務器中
(3)PLSQL不能被其它應用程序調用,例如:Java

存儲過程與PLSQL是什麼關係?
存儲過程是PLSQL的一個方面的應用,PLSQL是存儲過程的基礎

存儲過程的概念

存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,通過第一次編譯後再次調用不須要再次編譯,用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程

建立無參存儲過程hello,無返回值,語法:create or replace procedure 過程名 as PLSQL程序

刪除存儲過程hello,語法:drop procedure 過程名

調用存儲過程方式一,exec 存儲過程名

調用存儲過程方式二,PLSQL程序

調用存儲過程方式三,Java程序

建立無參存儲過程HELLO,無返回值,語法:CREATE OR REPLACE PROCEDURE 過程名 AS PLSQL程序sql

?
1
2
3
4
5
6
CREATE OR REPLACE PROCEDURE HELLO
AS
BEGIN
     DBMS_OUTPUT.PUT_LINE( '第一個存儲過程' );
END ;
/

刪除存儲過程HELLO,語法:DROP PROCEDURE 過程名數據庫

 

?
1
DROP PROCEDURE HELLO;

 

調用存儲過程方式一,EXEC 存儲過程名服務器

?
1
EXEC HELLO;

調用存儲過程方式二,PLSQL程序oracle

?
1
2
3
4
BEGIN
     HELLO;
END ;
/

調用存儲過程方式三,JAVA程序函數

使用CALLABLESTATEMENT類進行調用

建立有參存儲過程RAISESALARY(編號),爲7369號員工漲10%的工資,演示IN的用法,默認IN,大小寫不敏感spa

?
1
2
3
4
5
6
CREATE OR REPLACE PROCEDURE RAISESALARY(PEMPNO IN NUMBER)
AS
BEGIN
     UPDATE EMP SET SAL=SAL*1.2 WHERE EMPNO=PEMPNO;
END ;
/

調用
EXEC RAISESALARY(7369);

建立有參存儲過程FINDEMPNAMEANDSALANDJOB(編號),查詢7788號員工的的姓名,職位,月薪,返回多個值,演示OUT的用法設計

?
1
2
3
4
5
6
CREATE OR REPLACE PROCEDURE FINDINFO(PEMPNO IN NUMBER,PENAME OUT VARCHAR2,PJOB OUT VARCHAR2,PSAL OUT NUMBER)
AS
BEGIN
     SELECT ENAME,JOB,SAL INTO PENAME,PJOB,PSAL FROM EMP WHERE EMPNO=7788;
END ;
/
?
1
 
?
1
2
3
4
5
6
7
8
9
10
調用
DECLARE
     PENAME EMP.ENAME%TYPE;
     PJOB EMP.JOB%TYPE;
     PSAL EMP.SAL%TYPE;
BEGIN
     FINDINFO(7788,PENAME,PJOB,PSAL);
     DBMS_OUTPUT.PUT_LINE( '7788員工的姓名是' ||PENAME|| '工做是' ||PJOB|| '薪資是' ||PSAL);
END ;
/

什麼狀況下用EXEC調用,什麼狀況下用PLSQL調用存儲過程?
EXEC適合存儲過程沒有返回值
PLSQL適合存儲過程含有多個返回值code

存儲函數


【1】建立無參存儲函數GETNAME,有返回值,語法:CREATE OR REPLACE FUNCTION 函數名 RETURN 返回類型 AS PLSQL程序段

?
1
2
3
4
5
6
CREATE OR REPLACE FUNCTION GETNAME RETURN VARCHAR2
AS
BEGIN
     RETURN 'hello function' ;
END ;
/

【2】刪除存儲函數GETNAME,語法:DROP FUNCTION 函數名

?
1
DROP FUNCTION GETNAME;

【3】調用存儲函數方式一,PLSQL程序

?
1
2
3
4
5
6
7
declare
     name varchar2(50);
begin
     name :=getName();
     dbms_output.put_line( name );
end ;
/

【4】調用存儲函數方式二,JAVA程序

【5】建立有參存儲函數findempincome(編號),查詢7369號員工的年收入,演示IN的用法,默認IN

?
1
2
3
4
5
6
7
8
create or replace function findNumber(pempno in number) return number
as
     psal number;
begin
     select sal into psal from emp where empno=pempno;
     return psal;
end ;
/
?
1
 
?
1
2
3
4
5
6
7
8
調用
declare
     income number;
begin
     income:=findNumber(7369);
     dbms_output.put_line(income);
end ;
/

【6】建立有參存儲函數findempnameandjobandsal(編號),查詢7788號員工的的姓名(RETURN),職位(OUT),月薪(OUT),返回多個值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create or replace function findSix(pempno in number,pjob out varchar2,psal out varchar2) return varchar2
as
     pename emp.ename%type;
     --pjob emp.job%type;
     --psal emp.sal%type;
begin
     select ename,job,sal into pename,pjob,psal from emp where empno=pempno;
     return pename;
end ;
/
 
 
-- 調用
declare
     pename emp.ename%type;
     pjob emp.job%type;
     psal emp.sal%type;
begin
     pename:=findSix(7788,pjob,psal);
     dbms_output.put_line(pename||pjob||psal);
end ;
/

過程函數適合場景聲明:適合不是強行要你使用,只是優先考慮什麼狀況下【適合使用】存儲過程?什麼狀況下【適合使用】存儲函數?【適合使用】存儲過程: 無返回值或者由多個返回值時適合過程。【適合使用】存儲函數:有且只有一個返回值時,適合函數。什麼狀況【適合使用】過程函數,什麼狀況【適合使用】SQL?【適合使用】過程函數:》須要長期保存在數據庫中》須要被多個用戶重複調用》業務邏輯相同,只是參數不同》批操做大量數據,例如:批量插入不少數據【適合使用】SQL:》凡是上述反面,均可使用SQL》對錶,視圖,序列,索引,等這些仍是要用SQL

相關文章
相關標籤/搜索