存储过程:
是在大型
数据库系统
中,一组为了完成特定功能的SQL 语句集,
存储在数据库中,经过第一次编译后再次调用不需要再次编译,
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程,
类似于java的方法。
优点
1.效率高
存储过程编译一次后,就会存到数据库,每次调用时都直接执行。而普通的sql语句我们要保存到其他地方(例如:记事本 上),都要先分析编译才会执行。所以想对而言存储过程效率更高。
2.降低网络流量
存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。
3.复用性高
存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。
4.可维护性高
当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。
5.安全性高
完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。
存储过程语法
1 CREATE OR REPLACE PROCEDURE 存储过程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
行2:
IS关键词表明后面将跟随一个PL/SQL体。
行3:
BEGIN关键词表明PL/SQL体的开始。
行4:
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
行5:
END关键词表明PL/SQL体的结束
简单案例
CREATE OR REPLACE PROCEDURE 存储过程名称(
s_no in varchar,
s_name out varchar,
s_age number) AS
total NUMBER := 0;
BEGIN
SELECT COUNT(1) INTO total FROM student s WHERE s.age=s_age;
dbms_output.put_line(‘符合该年龄的学生有’||total||’人’);
EXCEPTION
WHEN too_many_rows THEN
DBMS_OUTPUT.PUT_LINE(‘返回值多于1行’);
END
create or replace procedure runbyparmeters
create or replace procedure runbyparmeters
(isal
in
emp.sal%type,
(isal
in
emp.sal%type,
sname
out
varchar,
sname
out
varchar,
sjob
in
out
varchar)
sjob
in
out
varchar)
as
as
icount number;
icount number;
begin
begin
select
count(*)
into
icount
from
emp
where
sal>isal and job=sjob;
select
count(*)
into
icount
from
emp
where
sal>isal and job=sjob;
if
icount=1 then
if
icount=1 then
....
....
else
else
....
....
end
if
;
end
if
;
exception
exception
when too_many_rows then
when too_many_rows then
DBMS_OUTPUT.PUT_LINE(
'返回值多于1行'
);
DBMS_OUTPUT.PUT_LINE(
'返回值多于1行'
);
when others then
when others then
DBMS_OUTPUT.PUT_LINE(
'在RUNBYPARMETERS过程中出错!'
);
DBMS_OUTPUT.PUT_LINE(
'在RUNBYPARMETERS过程中出错!'
);
end;
end;