1.语法
create [or replace] procedure pro_name[(parameter1,parameter2,...)] is|as begin plsql_sentences; [exception] [dowith_sentences;] end pro_name;
pro_name:存储过程名称
parameter1:参数
plsql_sentences:PL/SQL语句,它是存储过程功能实现的主体。
dowith_sentences:异常处理语句,也是PL/SQL语句。
上面的parameter1指的是存储过程被调用时候用的参数,内部变量需要在is|as关键字后边定义,并使用;号结束
2.环境准备
2.1 创建表TMP001
字段 | 描述 | 类型 |
id | 客户编号 | int |
name | 客户名称 | varchar2(100) |
gender | 客户性别 | varchar2(2) |
age | 客户年龄 | int |
address | 客户地址 | varchar2(200) |
脚本:
create table TMP001( id int not null, name varchar2(100), gender varchar2(2), age int, address varchar2(200) )
3.具体案例
3.1创建一个简单存储过程,往表TMP001插入一条记录
/******************************************************** 功能名称:用于简单存储过程测试 用途 :插入一条记录到TMP001表中 参数列表 --------------------------------------------------------- 参数 IN/OUT 类型 描述 --------------------------------------------------------- 无 --------------------------------------------------------- 版本号:1.0 --------------------------------------------------------- 作者:Qinys 日期:20180915 说明:创建 --------------------------------------------------------- --------------------------------------------------------- ********************************************************/ create or replace procedure proInsertTmp001 is begin insert into TMP001 values(1,'张三','男',29,'云南省昆明市'); commit; dbms_output.put_line('插入记录成功!'); end proInsertTmp001;
上述存储过程放在PL/SQL Developer中编译通过后,即可调用查看结果
调用存储过程
①execute命令调用:execute proInsertTmp001
②使用PL/SQL块
begin
proInsertTmp001;
end;
3.2声明一个带IN模式的存储过程
/********************************************************************** 功能名称:用于测试带IN的存储过程 用途 :插入一条记录到TMP001表中 参数列表 参数列表 ----------------------------------------------------------------------- 参数 IN/OUT 类型 描述 ----------------------------------------------------------------------- int_id IN INT 客户编号 var_name IN VARCHAR2 客户名称 var_gender IN VARCHAR2 客户性别 int_age IN INT 客户年龄 var_address IN VARCHAR2 客户地址 ----------------------------------------------------------------------- 版本号:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 说明:创建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure proInsertTmp002( int_id in int, var_name in varchar2, var_gender in varchar2, int_age in int, var_address in varchar2 ) is begin insert into TMP001 values(int_id,var_name,var_gender,int_age,var_address); commit; dbms_output.put_line('插入记录成功!'); end proInsertTmp002;
调用存储过程
查看结果
3.3 声明一个带OUT模式的存储过程
/********************************************************************** 功能名称:用于测试带OUT的存储过程 用途 :调用存储过程,并返回调用结果 参数列表 ----------------------------------------------------------------------- 参数 IN/OUT 类型 描述 ----------------------------------------------------------------------- int_id IN INT 客户编号 var_name IN VARCHAR2 客户名称 var_gender IN VARCHAR2 客户性别 int_age IN INT 客户年龄 默认值为:18 var_address IN VARCHAR2 客户地址 默认值为:China flag OUT VARCHAR2 1-成功 0-失败 msg OUT VARCHAR2 返回错误代码 ----------------------------------------------------------------------- 版本号:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 说明:创建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure proInsertTmp004( int_id in int, var_name in varchar2, var_gender in varchar2, int_age in int default 18, var_address in varchar2 default 'China', flag out varchar2, msg out varchar2 ) is begin proInsertTmp003(int_id,var_name,var_gender,int_age,var_address); commit; --主体程序运行完毕 flag :='1'; --异常处理 exception when others then rollback; flag :=0; msg :='错误原因'|| sqlcode || ',' || sqlerrm(sqlcode); end proInsertTmp004;
我们正常调用存储过程proInsertTmp004
在output可以看到结果
非正常调用
output结果
3.4 声明一个带OUT模式的存储过程
/********************************************************************** 功能名称:根据flag标志,若为True,则返回平方,反之,则返回平方根 用途 : 用于测试IN OUT参数的存储过程 参数列表 ----------------------------------------------------------------------- 参数 IN/OUT 类型 描述 ----------------------------------------------------------------------- num IN OUT NUMBER 输入的值 flag IN boolean 只有True与False两种类型 ----------------------------------------------------------------------- 版本号:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 说明:创建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure pro_square( num in out number, flag in boolean) is i int :=2; begin if flag then num:=power(num,i); else num:=sqrt(num); end if; end pro_square;
调度存储过程
declare var_temp number; var_num number; bool_flag boolean; begin var_temp := 4; var_num := var_temp; bool_flag := false; pro_square(var_num,bool_flag); if bool_flag then dbms_output.put_line(var_temp||'的平方是:'||var_num); else dbms_output.put_line(var_temp||'的平方根是:'||var_num); end if; end;
调度结果是:
3.5 创建带有默认值的存储过程
/********************************************************************** 功能名称:用于测试带默认值的存储过程 用途 :插入一条记录到TMP001表中 参数列表 ----------------------------------------------------------------------- 参数 IN/OUT 类型 描述 ----------------------------------------------------------------------- int_id IN INT 客户编号 var_name IN VARCHAR2 客户名称 var_gender IN VARCHAR2 客户性别 int_age IN INT 客户年龄 默认值为:18 var_address IN VARCHAR2 客户地址 默认值为:China ----------------------------------------------------------------------- 版本号:1.0 ----------------------------------------------------------------------- 作者:Qinys 日期:20180915 说明:创建 ----------------------------------------------------------------------- ----------------------------------------------------------------------- **********************************************************************/ create or replace procedure proInsertTmp003( int_id in int, var_name in varchar2, var_gender in varchar2, int_age in int default 18, var_address in varchar2 default 'China' ) is begin insert into TMP001 values(int_id,var_name,var_gender,int_age,var_address); commit; dbms_output.put_line('插入记录成功!'); end proInsertTmp003;
调用存储过程
此处指传入前三个参数
4.存储过程调用传递参数
4.1使用指定名称传递的方式传递参数
4.1.1 语法
pro_name(parameter1=>value1[,parameter1=>value1]…)
4.1.2 例子
我们从数据库的得知,确实已经插入,并且字段顺序没变
4.2使用按位置的方式传递参数
4.2.1 语法
此种传递是我们最常用的,也就是值与参数一一对应
4.2.2 例子
见具体案例3.2中的调用存储过程
4.3使用按位置的方式传递参数
4.3.1 语法
上述两种传递方式混合起来,但是在某个位置使用“指定名称传递”之后,后边的参数值必须使用指定名称传递,因为参数的原始定义顺序可能已经被破坏
4.3.2 例子