跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

达梦数据库 JAVA 外部函数使用指南

综述由AI生成在达梦数据库中创建和使用 Java 外部函数的完整流程。主要步骤包括开启 ENABLE_EXTERNAL_CALL 参数并重启服务,配置 dmagent 及生成 service.key,将编译好的 Java 类打包为 JAR 并放置到指定目录,最后通过 CREATE FUNCTION 语句注册外部函数并进行验证。文中详细列出了环境信息、语法说明、注意事项及具体的操作命令示例。

链路追踪发布于 2026/3/21更新于 2026/5/419 浏览
达梦数据库 JAVA 外部函数使用指南

一、环境信息

名称值
CPU12th Gen Intel(R) Core(TM) i7-12700H
操作系统CentOS Linux release 7.9.2009 (Core)
内存7G
逻辑核数8
DM 版本DM Database Server 64 V8
DB Version: 0x7000d
03134284368-20250917-293539-20149
Msg Version: 44
Gsu level(5) cnt: 0

四、介绍

1、语法树

CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] [<模式名>.]<函数名>[(<外部函数参数列表>)] RETURN <返回值类型> EXTERNAL '<jar 包路径>' [AND] <引用的 JAVA 函数名>[(<JAVA 函数参数列表>)] USING JAVA;

2、参数

名称描述
<函数名>被创建的 JAVA 外部函数的名字;
<模式名>被创建的 JAVA 外部函数所属模式的名字,缺省为当前模式名;
<外部函数参数列表>JAVA 外部函数参数信息;
<外部函数参数模式>可设置为 IN、OUT 或 IN OUT(OUT IN),缺省为 IN 类型。参数类型、个数都应和 jar 包里的一致;
<外部函数参数类型>目前支持的函数参数类型:int、字符串(char、varchar、varchar2)、bigint、double/float/binary_float、binary/varbinary、clob、blob,分别对应 java 类型:int、string、long、double、byte[]、string、byte[];
<返回值类型>必须 jar 包里定义的一致;
<jar 包路径>用户按照 JAVA 语言格式编写的源码生成的 jar 包,及其依赖的 jar 包所在的相对路径或绝对路径;
<引用的 JAVA 函数名>指明<函数名>在<jar 包路径>中对应的 JAVA 函数名,函数调用通过 JAVA 反射实现,建议调用函数访问限定符为 public,另外,所属类须不含构造函数或包含无参的构造函数。若<函数名>包含包名,则包名(或.包名)与类名的分隔符要用.或/。而类与方法的分隔符要用.。若不指定<引用函数名>,则后续使用 JAVA 外部函数时会报错。一个正确的 JAVA 函数名示例如下:……EXTERNAL '/data/sda/test.jar' "com.test.package1.test.pass(java.lang.String,java.lang.String[])" USING JAVA;;
<JAVA 函数参数列表>用于指定 JAVA 函数的参数列表。缺省情况下,系统自动定位参数。只有未指定<外部函数参数模式>或<外部函数参数模式>中所有参数模式均为 IN 时,<JAVA 函数参数列表>才可缺省; <JAVA 函数参数声明>由一个或多个<JAVA 函数参数类型>组成。<JAVA 函数参数类型>书写时必须包括 JAVA 类的完整名称。例如:……EXTERNAL '/data/sda/test.jar' "com.test.package1.test.pass(java.lang.String,java.lang.String[])" USING JAVA;。

3、注意点

序号描述
1当<引用的 JAVA 函数名>[(<JAVA 函数参数列表>)]的长度超过 128 个字节并且不超过 32767 个字节时,不能使用双引号,需要改用单引号括起来,并且需要指定 AND 关键字。例如:EXTERNAL '/data/sda/test.jar' AND 'com.test.package1.test.pass(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)' USING JAVA;
2三权分立下,仅允许拥有 DBA 权限的用户创建外部函数;四权分立下,仅允许拥有 DB_OBJECT_ADMIN 权限的用户创建外部函数;
3创建或执行外部函数需要设置 INI 参数 ENABLE_EXTERNAL_CALL 为 1;

五、实验步骤

1、开启参数

[root@rhel709:/root]# cat /dmdata/DAMENG2/dm.ini |grep ENABLE_EXTERNAL_CALL
ENABLE_EXTERNAL_CALL = 1 #Whether permit external call

直接修改文件可能不生效,建议使用 SP_SET_PARA_VALUE 设置。

SQL> SP_SET_PARA_VALUE(2,'ENABLE_EXTERNAL_CALL',1);
DMSQL 过程已成功完成
已用时间:9.553(毫秒). 执行号:1002.

2、重启数据库服务

[dmdba@rhel709 bin]$ ./DmServiceDM restart

3、生成并安装 service.key

[dmdba@rhel709 dmagent]$ ./start.sh INSTALL_SERVICE_KEY 999999
tip: if using the deployment feature, it is recommended to start dmagent with the '-d' parameter.
Agent-V7.6.1.34685-2025.03.26-DEV Key file: "/dm/dmdbms/tool/dmagent/service.key" generated.

4、agent.ini 配置

[dmdba@rhel709 dmagent]$ cat agent.ini |grep -E 'ap_enable|ap_port'
ap_enable = true #whether enable ap plugin
ap_port = 6363 #ap listen tcp/ip port, range[1~65535]
[dmdba@rhel709 dmagent]$ pwd
/dm/dmdbms/tool/dmagent

agent.ini 配置的 6363 端口需和 dm.ini 中的 EXTERNAL_JFUN_PORT 参数一致。

[dmdba@rhel709 dmagent]$ cat /dmdata/DAMENG2/dm.ini |grep EXTERNAL_JFUN_PORT
EXTERNAL_JFUN_PORT = 6363 #DmAgent port for external java fun.

5、启动 dmagent

[dmdba@rhel709 dmagent]$ ./start.sh -d agent.ini
Starting dmagent.....
dmagent(pid: 16039) started successfully.

6、源码

[dmdba@rhel709 DmJar]$ cat test.java
package com.test.package1;
public class test {
    public static int testAdd(int a, int b) {
        return a + b;
    }
    public static String testStr(String str) {
        return str + " hello";
    }
}

7、编译

[dmdba@rhel709 DmJar]$ javac -d . test.java

8、打 Jar 包

[dmdba@rhel709 DmJar]$ jar cvf test.jar com/test/package1/test.class
已添加清单
正在添加:com/test/package1/test.class(输入 = 526) (输出 = 323)(压缩了 38%)

9、拷贝 jar 包

cp /home/dmdba/DmJar/test.jar /dm/dmdbms/tool/dmagent/resources/ap/

一定要放到这个目录下,不然在执行时会提示如下报错:

SQL> select MY_chr('abc');
[-7094]:外部函数共享库加载失败,错误详情 [invalid jar path, jar should under resources/ap directory].
已用时间:2.153(毫秒). 执行号:0.

10、创建外部函数

这里建议大家设置相对路径,这样可以避免在集群模式下,多节点目录不一致导致找不到 JAR 包的问题。

CREATE OR REPLACE FUNCTION MY_INT(a int, b int) RETURN int EXTERNAL 'resources/ap/test.jar' "com.test.package1.test.testAdd" USING java;
CREATE OR REPLACE FUNCTION MY_chr(s varchar) RETURN varchar EXTERNAL 'resources/ap/test.jar' "com.test.package1.test.testStr" USING java;

11、验证

SQL> select MY_INT(1,2);
行号 MY_INT(1,2)
---------- -----------
1 3
已用时间:0.942(毫秒). 执行号:4505.

SQL> select MY_chr('abc');
行号 MY_CHR('abc')
---------- -------------
1 abc hello
已用时间:1.080(毫秒). 执行号:4506.

目录

  1. 一、环境信息
  2. 四、介绍
  3. 1、语法树
  4. 2、参数
  5. 3、注意点
  6. 五、实验步骤
  7. 1、开启参数
  8. 2、重启数据库服务
  9. 3、生成并安装 service.key
  10. 4、agent.ini 配置
  11. 5、启动 dmagent
  12. 6、源码
  13. 7、编译
  14. 8、打 Jar 包
  15. 9、拷贝 jar 包
  16. 10、创建外部函数
  17. 11、验证
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 核心基础概念详解
  • 自然语言处理在教育领域的应用与实战
  • 双指针算法:从暴力遍历到线性高效重构数组操作
  • C++ 哈希表底层原理与实战实现详解
  • 前端技术博客创作 Agent 提示词设计与实战
  • 基于 ECharts 与 Three.js 的前端碳排放可视化大屏实现
  • 前端缓存策略实战:构建高性能 Web 应用
  • OpenStack 版本发布周期与系列概览
  • 地瓜机器人 RDK 系列选型指南:X3 vs X5 vs S100 vs S100P
  • 数据结构初阶:基于动态顺序表实现通讯录
  • 本地部署 Z-Image-Turbo AI 绘画快速入门指南
  • 基于飞书 AI 知识库的高效文档问答系统搭建指南
  • 递归算法详解:汉诺塔、链表操作与快速幂
  • Python 文件操作基础:模式、读写与指针控制
  • AI Agent 安全警示与工具演进:从 Meta 事故到 Claude Code 及 Python 3.15 JIT 进展
  • OpenClaw 部署飞书机器人实战指南
  • Python 核心语法详解:变量、流程控制与函数基础
  • Python 类与对象核心特性
  • 前端开发基础:CSS 核心语法与常用属性详解
  • OpenClaw 集成飞书机器人部署指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online