授予scott用户创建存储过程的权限
GRANT CREATE PROCEDURE TO SCOTT;
一.什么是存储过程
存储过程,百度百科上是这样解释的,存储过程(Stored Procedure)是在大型数据库系统中,
一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,
用户通过指定存储过程的名字并给出参数
(如果该存储过程带有参数)来调用存储过程。
简单的说就是专门干一件事一段sql语句。
可以由数据库自己去调用,也可以由java程序去调用。
在oracle数据库中存储过程是procedure。
二.为什么要写存储过程
1.效率高
存储过程编译一次后,就会存到数据库,每次调用时都直接执行。而普通的sql语句我们要保存到其他地方(例如:记事本 上),
都要先分析编译才会执行。所以想对而言存储过程效率更高。
2.降低网络流量
存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。
3.复用性高
存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。
4.可维护性高
当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。
5.安全性高
完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。
三.存储过程基础
1.存储过程结构
(1).基本结构
Oracle存储过程包含三部分:过程声明,执行过程部分(可写可不写,要增强脚本的容错性和调试的方便性那就写上异常处理)
(2).无参数存储过程
CREATE [OR REPLACE] PROCEDURE 存储过程名称
AS/IS --这里的as和is一样任选一个,在这里没有区别,其中demo是存储过程名称。
[变量1 DATETYPE [:=值][default 值],
变量2 datatype...]
begin
--需要处理的业务逻辑
[EXCEPTION]--存储过程异常处理
end [存储过程名称];
(3).有参数的存储过程
CREATE [OR REPLACE] PROCEDURE 存储过程名称(
参数1 [in/out/in out] datetype,--in可省略数据类型不能带长度
.....
)
AS/IS
[变量1 DATETYPE [:=值][default 值],
变量2 datatype...]
begin
--需要处理的业务逻辑
[EXCEPTION]--存储过程异常处理
end [存储过程名称];
IN表示输入参数,是参数的默认模式。
OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。
OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去
(4).存储过程调用方法
1.块中调用
DECLARE --可写可不写
begin
pc_anme;-- 在此处也可使用pc_name();
end;
2.call调用
call pc_name();--括号不能少
3.命令行执行调用
打开oracle自带的dbms_output.put_line输出,使打印的内容在界面显示需要执行:
SET SERVEROUT ON;
execute/EXEC mydemo01();--没有参数括号可省略
注意:调用存储过程的时候,可以位置传参也可以参数传参,也可以混合传参,但是所有位置参数必须写在参数传递前面
pc_name(values1,values2,参数3=>values3)
有输出参数out相关的需要提前定义参数,传递参数,不能之间传递值,以用来接收输出变量值
删除存储过程:
drop PROCEDURE 过程名称;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--简单列子
create or replace procedure myDemo01(A OUT NUMBER,b number,c in out number)
as
begin
A:=90;
C:=100;
dbms_output.put_line(A);
dbms_output.put_line(B);
dbms_output.put_line(C);
dbms_output.put_line('hello word, my name is stored procedure');
end;
--调用
declare
a number;
b number default 10;
c number default 20;
begin
myDemo01(a,b,c);
dbms_output.put_line(A);
dbms_output.put_line(B);
dbms_output.put_line(C);
end;
11-30
6554
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交