oracle进阶2

本文详细介绍了Oracle数据库中的存储函数和存储过程,包括它们的定义、语法、区别以及如何创建和调用。重点讲述了存储函数的返回值、使用场景和存储过程的参数模式,以及带有传出参数的存储过程示例。
摘要由CSDN通过智能技术生成

第一章 存储函数

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;
​



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值