存儲過程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