Oracle存储过程怎么写啊,给个简单点的例子参考下吧
- 问答
- 2026-01-09 18:13:30
- 2
要理解Oracle存储过程,您可以把它想象成在数据库内部预先录制好的一套操作指令,当您需要重复执行一系列复杂的数据库操作(比如同时更新好几张表、进行复杂的数据校验等)时,不需要在应用程序里写一大堆零散的SQL语句,只需要简单地调用一下这个“录制好的操作集”的名字,数据库就会自动按顺序执行所有步骤,这样做的好处是提高了效率,减少了网络传输(因为指令都在数据库内部执行),并且逻辑集中,便于管理和维护。
下面,我们通过一个非常贴近生活的例子来一步步说明,假设我们管理一个简单的图书馆系统,有两张表:一张是图书表(books),记录图书的信息和库存;另一张是借阅记录表(borrow_records),我们需要实现一个“借书”的功能,这个功能至少需要做两件事:在借阅记录表中插入一条新的借阅记录;需要将图书表中对应图书的库存数量减1,为了保证数据的一致性,这两步操作必须同时成功或同时失败,存储过程非常适合处理这种事务。
我们假设两张表的结构非常简单,如下所示(您不需要执行,只是为了理解例子):
- 图书表(books): book_id(图书编号),book_name(图书名称),stock(库存数量)。
- 借阅记录表(borrow_records): record_id(记录编号),book_id(图书编号),borrower(借书人),borrow_date(借书日期)。
我们的目标是创建一个名为 borrow_book 的存储过程,它接收两个参数:要借阅的图书编号和借书人的姓名。

根据Oracle官方文档中关于CREATE PROCEDURE的语法说明,一个最基本的存储过程结构如下:
CREATE [OR REPLACE] PROCEDURE 过程名称 ( 参数1 [IN | OUT | IN OUT] 数据类型, 参数2 [IN | OUT | IN OUT] 数据类型, ... ) IS -- 这里可以声明一些变量,就像在程序里声明局部变量一样 BEGIN -- 这里是存储过程的核心,写下要执行的SQL语句和逻辑代码 EXCEPTION -- 这里是异常处理部分,当BEGIN中的代码出错时,会跳到这里执行 END 过程名称; /
我们根据这个结构,来编写我们的“借书”存储过程。
-- 创建或替换一个名为 borrow_book 的存储过程
CREATE OR REPLACE PROCEDURE borrow_book (
-- 定义输入参数:要借阅的图书编号,类型与books表中的book_id一致
p_book_id IN books.book_id%TYPE,
-- 定义输入参数:借书人姓名,我们假设是一个字符串,长度50
p_borrower IN VARCHAR2
)
IS
-- 声明一个局部变量v_current_stock,用于临时存放当前库存
v_current_stock books.stock%TYPE;
BEGIN
-- 第一步:查询当前图书的库存,并将结果存入变量v_current_stock中
SELECT stock INTO v_current_stock
FROM books
WHERE book_id = p_book_id;
-- 第二步:判断库存是否大于0,如果小于等于0,则无法借阅,我们抛出一个自定义的错误
IF v_current_stock <= 0 THEN
-- 使用RAISE_APPLICATION_ERROR过程抛出一个错误,-20001是自定义错误代码,‘该书库存不足!’是错误信息
RAISE_APPLICATION_ERROR(-20001, '该书库存不足!');
END IF;
-- 第三步:如果库存充足,向借阅记录表插入一条新记录
INSERT INTO borrow_records (book_id, borrower, borrow_date)
VALUES (p_book_id, p_borrower, SYSDATE); -- SYSDATE是系统当前日期
-- 第四步:更新图书表,将对应图书的库存减1
UPDATE books
SET stock = stock - 1
WHERE book_id = p_book_id;
-- 第五步:提交事务,确保上面的插入和更新操作永久生效。
-- 注意:在实际项目中,事务提交有时会在调用存储过程的应用程序中控制,这里为了示例清晰直接提交。
COMMIT;
-- 输出一条成功信息(可选,主要用于调试)
DBMS_OUTPUT.PUT_LINE('借书成功!');
EXCEPTION
-- 异常处理部分:如果上面BEGIN块中的任何一句SQL出错了(比如查不到书,主键冲突等),都会跳到这里
WHEN OTHERS THEN
-- 回滚事务,撤销本存储过程内所有未提交的操作,保证数据一致性
ROLLBACK;
-- 将错误信息再次抛出,让调用者知道发生了什么问题
RAISE;
END borrow_book;
/
存储过程已经创建好了,它就像数据库里的一个函数,我们如何测试它呢?在SQLPlus、SQL Developer等工具中,可以这样调用:

-- 调用存储过程,借阅编号为101的图书,借书人是“张三” EXECUTE borrow_book(101, '张三');
或者使用匿名块的方式调用:
BEGIN borrow_book(101, '张三'); END; /
如果一切正常,您会看到“借书成功!”的输出,并且borrow_records表会多一条记录,同时books表中book_id为101的图书库存会减少1,如果这本书的库存已经是0,那么调用这个存储过程就会收到一个明确的错误提示:“该书库存不足!”。
这个简单的例子展示了存储过程的核心要素:
- 使用
CREATE OR REPLACE PROCEDURE来创建。 - 定义输入参数(IN)或输出参数(OUT),让调用者可以传递数据进去或获取结果出来。
- 在
IS和BEGIN之间声明局部变量。 - 在
BEGIN ... END之间编写核心业务逻辑,可以包含查询(SELECT)、DML语句(INSERT/UPDATE/DELETE)、条件判断(IF)、循环(LOOP)等。 - 使用
EXCEPTION进行异常处理,确保程序的健壮性。 - 合理控制事务,使用
COMMIT(提交)和ROLLBACK(回滚)来保证数据完整性。
希望这个从零开始的例子能帮助您直观地理解Oracle存储过程的基本写法,当您熟悉了这种模式后,就可以在此基础上添加更复杂的逻辑,比如使用循环处理多条数据、使用游标进行复杂查询、定义输出参数返回结果集等。
本文由凤伟才于2026-01-09发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/77582.html
