准备:ORACLE 11g
编辑器: pl/sql developer
1. 什么是存储过程?
简单点理解,存储过程类似于java程序中的函数,具有模块化,可重用性,可维护,更安全的特点,并且可以被程序调用(是不是类似于函数)。存储过程分为4类:(1)不带参数的;(2)带输入参数的;(3)带输出参数的;(4)带输入输出参数的。
2. 存储过程的语法
CREATE [OR REPLACE] PROCEDURE <过程名>[(参数列表)] IS|AS
[局部变量声明]
BEGIN
可执行语句
[EXCEPTION
异常处理语句]
END [<过程名>];
IS|AS :表示可以使用 IS ,也可以使用AS
OR REPLACE:如果系统已存在该存储过程,将被替换
参数列表:参数不需要声明长度,可选
参数变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
【调用方式】
在PL/SQL块中直接使用过程名;
在PL/SQL程序外使用 exec[ute] <过程名>[(参数列表)];
注意:上面的中括号表示可有可无
3存储过程的使用
(1)无参数的存储过程
CREATE OR REPLACE PROCEDURE PRO_TEST1 IS
BEGIN
DBMS_OUTPUT.put_line('HELLO WORLD!');
END;
---------------------------------------
BEGIN
PRO_TEST1;
END;
友情提示:先执行分割线上面定义的存储过程,再执行分割线下面的调用存储过程
执行结果为:
HELLO WORLD!
但是,在使用第二种方法EXECUTE 存储过程的时候,一直提醒 “不是有效的sql语句” ,经过上网查找方法,得知,我当前使用的是 sql窗口中 ,写的语句应该是sql语句,但是execute 存储过程是一个 命令语句,必须在命令窗口中执行,先输入 set serveroutpu on 命令,再执行 execute 存储过程,
(2)带输入参数的存储过程
当然,可以多次调用
BEGIN
PRO_TEST2(‘111223’,’小米’);
PRO_TEST2(‘111224’,’小那’);
PRO_TEST2(‘111225’,’小才’);
END;
结果我就不写了。
(3)带输出参数的存储过程
带输出参数的存储过程,输出参数的定义,必须使用OUT,在调用带输出参数的存储过程的时候,输出的变量需要在declare中定义(否则你将谁输出了)。
输出结果:
(4)带输入输出参数的存储过程
结果是:
当该存储过程的输出参数有多个时,并且你不知道他们的参数的位置次序,为了不把参数次数次序搞乱,可以使用下面方法:
比如:你的存储过程是这样定义的:
Create or replace procedure pro_query(
s_empid emp.t_empid%type, --第一个为员工编号
s_empname out t_emp.empname%type,--第二个为姓名
s_sal out t_emp.sal%type--第三个为薪资
)
如果你不知道存储过程的参数:第二个为 姓名 ,第三个为 薪资,可以在调用存储过程的时候的使用符号 => ;比如你调用存储过程:
declare
p_empname t_emp.empname%type;
p_empsal t_emp.sal%type;
begin
pro_query_enameAndSal_by_empno('11104', s_sal => p_sal, s_empname => p_empname );--使用符号 =>,可避免参数次序不对应问题
dbms_output.put_line('员工号为11104的员工名称为:'|| p_empname ||',其工资为:'|| p_sal);
end;