注册
包的用法(达梦、oracle兼容)
专栏/技术分享/ 文章详情 /

包的用法(达梦、oracle兼容)

zxw 2026/08/28 117 0 0
摘要

例如: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 业务逻辑(查数据、插表、生成交易号等)。

.pck是怎么产生的?

有三种常见方式:

  1. 手动编写:DBA/开发人员在 PL/SQL Developer、SQL Developer、Toad 里写好,保存为 .pck`或 .sql
  2. 工具导出:用 PL/SQL Developer 右键点击包 → “Export” → 自动生成包含包头+包体的 .pck`文件
  3. 版本控制:团队为了方便管理,把包头和包体放在一个文件里提交到 Git

用在什么地方?

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;
/
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服