oracle存储过程

文章介绍了存储过程的概念,包括它们在数据库中的作用和与存储函数的区别。提供了创建不带传出参数和带传出参数的存储过程的PL/SQL代码示例,并展示了如何在PL/SQL及JDBC中调用这些存储过程。案例中涉及了业主信息管理,通过存储过程实现数据的添加并返回新增ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程


(一)什么是存储过程

存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。应用程序可以调用存储过程,执行相应的逻辑。

存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:

1、存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。

2、存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。

3、存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码

(二)存储过程语法结构

创建或修改存储过程的语法如下:
在这里插入图片描述
在这里插入图片描述

过程参数的三种模式:

IN 传入参数(默认)

OUT 传出参数 ,主要用于返回程序运行结果

IN OUT 传入传出参数

(三)案例

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

JDBC 调用存储过程

/**
         * 增加
         * @param owners
         */
        public static void add (Owners owners){
            java.sql.Connection conn = null;
            java.sql.CallableStatement stmt = null;
            try {
                conn = BaseDao.getConnection();
                stmt = conn.prepareCall("{call
                        pro_owners_add( ?, ?,?,?,?)} ");
            stmt.setString(1, owners.getName());
            stmt.setLong(2, owners.getAddressid());
            stmt.setString(3, owners.getHousenumber());
            stmt.setString(4, owners.getWatermeter());
            stmt.setLong(5, owners.getOwnertypeid());
            stmt.execute();
        } catch(SQLException e){
            e.printStackTrace();
        }finally{
            BaseDao.closeAll(null, stmt, conn);
        }
    }

2 创建带传出参数的存储过程,需求:添加业主信息,传出参数为新增业主的 ID

代码如下(示例):

--增加业主信息存储过程
create or replace procedure pro_owners_add 
(
 v_name varchar2,
 v_addressid number,
 v_housenumber varchar2, 
 v_watermeter varchar2,
 v_type number,
 v_id out number
)
is 
begin
 select seq_owners.nextval into v_id from dual;
 insert into T_OWNERS 
values( v_id,v_name,v_addressid,v_housenumber,v_watermeter,sysdate,v_type );
 commit;
end;

PL/SQL 调用该存储过程

declare

 v_id number;--定义传出参数的变量

begin

 pro_owners_add('王旺旺',1,'922-3','133-7',1,v_id);

 DBMS_OUTPUT.put_line('增加成功,ID:'||v_id);

end;

执行成功后输出结果:
在这里插入图片描述
JDBC 调用存储过程

/**
         * 增加
         * @param owners
         */
        public static long add (Owners owners){
            long id = 0;
            java.sql.Connection conn = null;
            java.sql.CallableStatement stmt = null;
            try {
                conn = BaseDao.getConnection();
                stmt = conn.prepareCall("{call 
                        pro_owners_add( ?, ?,?,?,?,?)} ");
            stmt.setString(1, owners.getName());
            stmt.setLong(2, owners.getAddressid());
            stmt.setString(3, owners.getHousenumber());
            stmt.setString(4, owners.getWatermeter());
            stmt.setLong(5, owners.getOwnertypeid());
            stmt.registerOutParameter(6, OracleTypes.NUMBER);//注
            册传出参数类型
            stmt.execute();
            id = stmt.getLong(6);//提取传出参数
        } catch(SQLException e){
            e.printStackTrace();
        }finally{
            BaseDao.closeAll(null, stmt, conn);
        }
        return id;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值