存储过程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