例如:PROLCASE_GAIZAO3.pck
注意:Oracle 服务端并不认识 .pck这个扩展名。你在 SQL*Plus 里执行时,只要文件内容是合法 SQL,叫 .txt、.sql、.pck 都能运行。
Oracle PL/SQL 包(Package), 这是 DDL(数据定义语言),作用是让数据库把 PROLCASE_GAIZAO3.pck 这个包注册到数据字典里,以后我可以随时调用它,执行完这两段后,数据库里多出了一个包对象,但没有任何业务被执行。
达梦和oracle里@的含义:去磁盘上找文件执行,请帮我打开当前目录下名为 my_first_pkg 的文件,把里面的 SQL 读进来执行
由两大部分组成,中间用 / 分隔:
| 部分 | 关键字 | 作用 | 类比 |
|---|---|---|---|
| 包头 (Specification) | CREATE OR REPLACE PACKAGE ... IS |
声明 对外暴露的函数、过程、变量 | C语言的 .h 头文件 |
| 包体 (Body) | CREATE OR REPLACE PACKAGE BODY ... IS |
实现 上面声明的具体逻辑 | C语言的 .c 源文件 |
在PROLCASE_GAIZAO3.pck文件里,包头声明了 2 个过程:ProlCase_GaiZao3_no 和ProlCase_GaiZao3_text,包体里写了这两个过程真正的 SQL 业务逻辑(查数据、插表、生成交易号等)。
有三种常见方式:
PL/SQL 包是 Oracle 里组织代码的最佳方式,主要解决这些问题:
| 场景 | 说明 |
|---|---|
| 代码归类 | 把 20 个跟"理赔"相关的存储过程、函数塞进一个包里,而不是散落在数据库里 |
| 变量共享 | 包头里定义的变量,包体内所有过程都能共用 |
| 安全隐藏 | 包体可以写"私有过程"(不在包头声明),外部调用不了 |
| 性能优化 | 包第一次被调用时整体加载到内存,后续调用更快 |
| 版本管理 | 修改包体逻辑时,只要不动包头,其他依赖它的程序不用重新编译 |
PROLCASE_GAIZAO3.pck文件,就是一个典型的保险理赔数据报送包,把"生成交易号、写报案表、写结案表、写人伤明细"等一堆相关操作封装在一起。
一个包叫 my_first_pkg,包含: 一个函数(做加法)、一个过程(打印信息)
-- 创建包头,告诉别人这个包有什么功能
CREATE OR REPLACE PACKAGE my_first_pkg IS
-- 定义一个常量(所有人都能用)
g_company_name CONSTANT VARCHAR2(50) := '中国铁路保险';
-- 声明一个函数:传入两个数字返回它们的和
FUNCTION add_two_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER;
-- 声明一个过程:传入名字,打印欢迎语
PROCEDURE say_hello(p_name IN VARCHAR2);
END my_first_pkg;
/
-- 2. 创建包体:写真正的实现代码
CREATE OR REPLACE PACKAGE BODY my_first_pkg IS
FUNCTION add_two_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER IS
v_result NUMBER;
BEGIN
v_result := a + b;
RETURN v_result;
END add_two_numbers;
PROCEDURE say_hello(p_name IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('你好,' || p_name || '!欢迎来自 ' || g_company_name);
END say_hello;
END my_first_pkg;
/
在 SQL*Plus 里,包头和包体之间的 / 是必须的,表示"前面的语句现在执行"
如果看到 Package created和 Package body created就是成功了
粘贴进sql里执行或者是:
@/xxx路径/my_first_pkg.pck
这是 DDL(数据定义语言),作用是让数据库把 my_first_pkg 这个包注册到数据字典里,以后我可以随时调用它,执行完这两段后,数据库里多出了一个包对象,但没有任何业务被执行。
-- 先打开输出显示,缓冲区向客户端(屏幕)发送数据
SET SERVEROUTPUT ON;
-- 调用过程(注意语法:包名.过程名)
BEGIN
my_first_pkg.say_hello('张三');
END;
/
-- 调用函数(函数必须放在 SQL 语句或赋值里使用)
DECLARE
v_sum NUMBER;
BEGIN
v_sum := my_first_pkg.add_two_numbers(10, 20);
DBMS_OUTPUT.PUT_LINE('计算结果:' || v_sum);
END;
/
文章
阅读量
获赞
