1.1、Package创建语法
CREATE [ OR REPLACE ] PACKAGE package_name[ { AUTHID DEFINER } | { AUTHID CURRENT_USER } ] -- 相关权限设置{ IS | AS }[ declaration; ] ... -- 此处可声明自定义类型、常量、变量、游标等[{ -- 存储过程声明PROCEDURE proc_name([ argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ] ... ]) ;}|{ -- 函数声明FUNCTION func_name ([ argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ] ... ])RETURN rettype ;}] ...END [ package_name ] ;CREATE [ OR REPLACE ] PACKAGE BODY package_name{ IS | AS }[ private_declaration; ] ... -- 可定义私有常量、变量、游标、函数、存储过程等... 不对外开放供Pakcage内部使用[{PROCEDURE proc_name[ {argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ] ... }]{ IS | AS }[ declaration; ] [, ...]BEGINstatement; [...][ EXCEPTION{ WHEN exception [OR exception] [...]] THEN statement; }[...]]END [ proc_name ] ;}|{FUNCTION func_name [ argument_list ]RETURN rettype [DETERMINISTIC]{ IS | AS }[ declaration; ] [, ...]BEGINstatement; [...][ EXCEPTION{ WHEN exception [ OR exception ] [...] THEN statement; }[...]]END [ func_name ] ;}] ...END [ package_name ] ;
1.2、Package移除语法
DROP PACKAGE package_name; -- 移除整个包DROP PACKAGE BODY package_name; -- 移除当前包体
二、Package部分功能展示
2.1、常量
CREATE OR REPLACE PACKAGE PKG_CONSTANT ASC_CODE_SUCCESS CONSTANT VARCHAR2(10) := 'SUCCESS'; -- 声明常量并赋值PROCEDURE PRO_TEST;END PKG_CONSTANT;/CREATE OR REPLACE PACKAGE BODY PKG_CONSTANT ASPROCEDURE PRO_TEST ASBEGINDBMS_OUTPUT.PUT_LINE('PKG_CONSTANT.C_CODE_SUCCESS: '||PKG_CONSTANT.C_CODE_SUCCESS);END PRO_TEST;END PKG_CONSTANT;/-- 执行EXEC PKG_CONSTANT.PRO_TEST;-- 常量不被允许修改 尝试修改将会报错BEGINPKG_CONSTANT.C_CODE_SUCCESS := 'ERROR';DBMS_OUTPUT.PUT_LINE('PKG_CONSTANT.C_CODE_SUCCESS: '||PKG_CONSTANT.C_CODE_SUCCESS);END;/
运行结果如下:

2.2、变量
CREATE OR REPLACE PACKAGE PKG_VAR ASVAR_A VARCHAR2; -- 声明变量PROCEDURE PRO_TEST;END PKG_VAR;/CREATE OR REPLACE PACKAGE BODY PKG_VAR ASPROCEDURE PRO_TEST ASBEGIN-- 初次赋值PKG_VAR.VAR_A := 'VAR_TEST';DBMS_OUTPUT.PUT_LINE('PKG_VAR.VAR_A: '||PKG_VAR.VAR_A);-- 再次修改变量值PKG_VAR.VAR_A := 'VAR_A';DBMS_OUTPUT.PUT_LINE('PKG_VAR.VAR_A: '||PKG_VAR.VAR_A);END PRO_TEST;END PKG_VAR;/-- 执行EXEC PKG_VAR.PRO_TEST;
运行结果如下:

2.3、游标
CREATE TABLE example(manager_id INT, employee_id INT, employee VARCHAR2(30));INSERT INTO example VALUES(5, 1, 'Nick');INSERT INTO example VALUES(1, 2, 'Josh');INSERT INTO example VALUES(2, 3, 'Ali');INSERT INTO example VALUES(6, 4, 'Joe');INSERT INTO example VALUES(4, 5, 'Kyle');CREATE OR REPLACE PACKAGE PKG_CURSORASTYPE PKG_TYPE_CURSOR IS REF CURSOR;PROCEDURE PRO_TEST;END PKG_CURSOR;/CREATE OR REPLACE PACKAGE BODY PKG_CURSORASPROCEDURE PRO_TESTIScur_cursor PKG_TYPE_CURSOR;cur_val example%ROWTYPE;BEGINOPEN cur_cursor FOR SELECT * FROM example;LOOPFETCH cur_cursor INTO cur_val;EXIT WHEN NOT FOUND;DBMS_OUTPUT.PUT_LINE('manager_id: '||cur_val.manager_id||' employee_id: '||cur_val.employee_id||' employee: '||cur_val.employee);END LOOP;CLOSE cur_cursor;END PRO_TEST;END PKG_CURSOR;/-- 执行EXEC PKG_CURSOR.PRO_TEST
执行结果如下:

2.4、函数和存储过程
CREATE OR REPLACE PACKAGE PKG_TEST ASFUNCTION F_TEST( f_a INTEGER , f_b INTEGER ) RETURN INTEGER;PROCEDURE PRO_TEST;END PKG_TEST;/CREATE OR REPLACE PACKAGE BODY PKG_TEST ASFUNCTION F_TEST( f_a IN INTEGER , f_b IN INTEGER )RETURN INTEGERASf_c INTEGER;BEGINf_c := f_a + f_b;RETURN f_c;END F_TEST;PROCEDURE PRO_TESTASvar_a INTEGER;BEGINvar_a := PKG_TEST.F_TEST(12,13);DBMS_OUTPUT.PUT_line('PKG_TEST.F_TEST(12,13) = '|| var_a);END PRO_TEST;END PKG_TEST;/
运行结果如下:

2.5、自定义类型
CREATE OR REPLACE PACKAGE PKG_RECODE_TEST ASTYPE RECODE_TYPE IS RECORD(DS NUMBER(10, 3),DA VARCHAR(2));PROCEDURE PRO_TEST;END PKG_RECODE_TEST;/CREATE OR REPLACE PACKAGE BODY PKG_RECODE_TEST ASPROCEDURE PRO_TESTASrecode_a RECODE_TYPE;BEGINSELECT 1,'x' INTO recode_a FROM dual;DBMS_OUTPUT.PUT_line(recode_a.ds||' '||recode_a.da);END PRO_TEST;END PKG_RECODE_TEST;/-- 执行EXEC PKG_RECODE_TEST.PRO_TEST;
运行结果如下:

2.6、异常
CREATE OR REPLACE PACKAGE ERRLOGISno_such_table EXCEPTION;PRAGMA EXCEPTION_INIT (no_such_table, -942);invalid_table_name EXCEPTION;PRAGMA EXCEPTION_INIT (invalid_table_name, -903);PROCEDURE PRO_TEST;END;/CREATE OR REPLACE PACKAGE BODY ERRLOG ASPROCEDURE PRO_TESTASBEGINRAISE ERRLOG.no_such_table;DBMS_OUTPUT.PUT_LINE('ERROR');EXCEPTIONWHEN no_such_table THENDBMS_OUTPUT.PUT_LINE('SQLCODE: '||SQLCODE||' SQLERRM: '||SQLERRM);END PRO_TEST;END ERRLOG;/-- 执行EXEC ERRLOG.PRO_TEST;
运行结果如下:

三、注意事项
3.1、 无法正常结束,进入$状态
\set -- 查看ENABLE_PL_BLOCK参数\set ENABLE_PL_BLOCK on -- 使能ENABLE_PL_BLOCK
四、总结
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




