概念: 为了让大家通俗的理解这个这两个术语含义我用java中的两个名词来代替。package相当于java代码中的接口,package body则是接口的具体实现类。
比如我们一般写单个的存储过程时可以在声明后直接写具体执行的sql语句。
单个的存储过程
CREATE OR REPLACE PROCEDURE PROC_TEST IS
/* 声明变量 */
count number;
BEGIN
/* SQL代码 */
select * from dual;
/* 异常处理 */
EXCEPTIOIN
WHEN NO_DATA_FOUND THEN
--处理代码
WHEN OTHERS THEN
--处理代码
END PROC_TEST; --这里也可以直接写成: "END;"
或者声明一个package,在package body写具体执行的sql。其实目的就是把特定逻辑的sql封装到了一个包中,以为代码的复用。
CREATE OR REPLACE PACKAGE PACK_ZOO IS
/* 不带参数的存储过程 */
PROCEDURE WATCH_MONKEY;
/* 带参数的存储过程 */
PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER);
END PACK_ZOO;
CREATE OR REPLACE PACKAGE BODY PACK_ZOO IS
/*
* 不带参数的存储过程
*/
PROCEDURE WATCH_MONKEY IS
/* 参数声明 */
name VARCHAR2(12);
BEGIN
/* 处理体 */
SELECT * FROM DUAL;
/* 异常处理 */
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('无数据记录');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode); --sqlcode代表异常代码
DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm); --sqlerrm代表异常信息
END WATCH_MONKEY;
/*
*带参数的存储过程
*/
PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER) IS
/* 参数声明 */
name VARCHAR2(12);
BEGIN
/* 处理体 */
name := 'Hello Oracle!';
/* 异常处理 */
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('CATCH EXCEPTIOIN');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode); --sqlcode代表异常代码
DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm); --sqlerrm代表异常信息
END FEED_MONKEY;
END PACK_ZOO;```