第一章 存储函数
1.什么是存储函数?
存储函数又称为自定义函数。可以接收一个或多个参数,返回一个结果。
在函数中我们可以使用 PL/SQL 进行逻辑的处理.
2.存储函数语法
create [or replace] function 函数名(参数1 类型1,参数2 类型2,...)
return 结果变量数据类型
IS
变量声明部分;
begin
逻辑部分;
return 结果变量;
[exception 异常处理部分]
end;
案例:
-- 创建存储函数,根据地址 ID 查询地址名称
create function fn_getaddress(v_id number)
return varchar2
is
v_name varchar2(30);
begin
select name into v_name from t_address where id=v_id;
return v_name;
end;
第二章 存储过程
2.1. 什么是存储过程
存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。
应用程序可以调用存储过程,执行相应的逻辑。
存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:
1、存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
2、存储函数可以在select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
3、存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。
2.2. 存储过程语法结构
创建或修改存储过程的语法如下: 创建或修改存储过程的语法如下: CREATE [ OR REPLACE ] PROCEDURE 存储过程名称 (参数名 类型, 参数名 类型, 参数名 类型) IS|AS 变量声明部分; BEGIN 逻辑部分 [EXCEPTION 异常处理部分] END; 参数只指定类型,不指定长度 过程参数的三种模式: IN 传入参数(默认) OUT 传出参数,主要用于返回程序运行结果 IN OUT 传入传出参数
2.2.1. 创建不带传出参数的存储过程:添加业主信息
--增加业主信息序列 create sequence seq_owners start with 11; --增加业主信息存储过程 create or replace procedure pro_owners_add ( v_name varchar2, v_addressid number, v_housenumber varchar2, v_watermeter varchar2, v_type number ) is begin insert into t_owners values( seq_owners.nextval, v_name, v_addressid, v_housenumber, v_watermeter, sysdate, v_type ); commit; end;
PL/SQL 中调用存储过程 call pro_owners_add('赵伟',1,'999-3','132-7',1);
2.2.2. 创建带传出参数的存储过程
-- todo 需求3: 创建带传出参数的存储过程:添加业主信息 -- todo 1 调用序列下一个值 赋值给 v_id -- todo 2 插入 insert into -- todo 3 提交事务 -- todo 需求4: 调用存储过程 添加业主信息 且 打印返回的结果 -- todo 1 声明变量 v_id -- todo 2 调用存储过程 注意: 不需要 call -- todo 3 打印返回 v_id
-- todo 需求3: 创建带传出参数的存储过程:添加业主信息 create or replace procedure pro_owners_add_2( v_name varchar2, v_addressid number, v_housenumber varchar2, v_watermeter varchar2, v_type number, v_id out number ) is begin -- todo 1 调用序列下一个值 赋值给 v_id select seq_owners.nextval into v_id from dual; -- todo 2 插入 insert into insert into T_OWNERS (ID, NAME, ADDRESSID, HOUSENUMBER, WATERMETER, ADDDATE, OWNERTYPEID) values (v_id, v_name, v_addressid, v_housenumber, v_watermeter, sysdate, v_type); -- todo 3 提交事务 commit; end; declare -- todo 需求4: 调用存储过程 添加业主信息 且 打印返回的结果 -- todo 1 声明变量 v_id v_id number; begin -- todo 2 调用存储过程 注意: 不需要 call pro_owners_add_2('牛魔王', 1, '火焰山', '1008', 10, v_id); -- todo 3 打印返回 v_id DBMS_OUTPUT.PUT_LINE('添加成功! v_id: ' || v_id); end;