1. 现状
可通过如下方法生成UUID,当快速大量生成时,会有重复现象。故需要编写自定义函数(UDF),实现生成不重复ID的功能。
-- 32位大写
SELECT concat(hex(RAND()),hex(RAND())) as uuid FROM SYSIBM.SYSDUMMY1;
-- 32位小写
select lower(hex(RAND())||hex(RAND())) as uuid from sysibm.sysdummy1;
2. 环境要求
- JDK-1.5+。
- 以下操作请使用实例用户(如:bdapinst,注册过程除外)进行,避免权限问题。
3. UDF编写
```java import java.util.UUID; import COM.ibm.db2.app.UDF;
public class UDFUUID extends UDF{ public static String uuid(){ UUID uuid = UUID.randomUUID(); // 去掉中间的分隔 String uid = uuid.toString().replaceAll(“-“, “”); return uid; } }
<a name="zreSV"></a>
# 4. UDF编译
```bash
# 查看DB2自带的jdk_path
db2 get dbm cfg | grep -i jdk_path
# 查看DB2安装的JDK版本
/home/bdapinst/sqllib/java/jdk64/bin/java -version
# 编译自定义函数(UDF)
/home/bdapinst/sqllib/java/jdk64/bin/javac /home/bdapinst/UDFUUID.java
注意:此处建议通过DB2自带的JDK进行编译,如果安装DB2时没有安装好JDK环境,则可选择下载对应版本的IBM JDK Windows版本,在Windows上完成自定义函数代码编写和编译,之后再上传至DB2环境。
5. UDF注册
- 类路径方式
```sql
直接把.class文件拷贝到$HOME/sqllib/function下
cp /home/bdapinst/UDFUUID.class /home/bdapinst/sqllib/function/UDFUUID.class
— 使用数据库默认模式名对应的用户进行操作
drop function uuid;
create function uuid()
returns char(32)
fenced
variant
no sql
language java
parameter style java
external name ‘UDFUUID!uuid’;
— 说明 —— external name:叹号前是文件名,叹号后为函数名
- **Jar包方式**
```sql
# 把此类打成jar包(最好用db2的jdk打包),比如叫UUIDUDF.jar
/home/bdapinst/sqllib/java/jdk64/bin/jar cvf UUIDUDF.jar UDFUUID.class
cp /home/bdapinst/UUIDUDF.jar /home/bdapinst/sqllib/function/UUIDUDF.jar
db2 'call sqlj.install_jar("file:/home/bdapinst/sqllib/function/UUIDUDF.jar", "schema.CMWP_BI")'
-- 使用数据库默认模式名对应的用户进行操作
drop function uuid;
create function uuid()
RETURNS char(32)
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT DETERMINISTIC NO EXTERNAL ACTION NO SQL
EXTERNAL NAME 'schema.CMWP_BI:UDFUUID.uuid';
-- 说明
---- external name:叹号前是schema.模式名,叹号后为文件名.函数名
注意:注册函数时,建议使用数据库默认模式名对应的用户进行操作,否则注册后用默认模式名用户调用时需要带上注册时使用的模式名才行。
6. UDF查看
SELECT * from syscat.functions where funcname like '%UUID%' with ur;
7. UDF使用
-- 使用数据库默认模式名对应的用户进行注册
values uuid();
select uuid() from SYSIBM.SYSDUMMY1;
-- 使用数据库非默认模式名对应的用户(如:实例用户,bdapinst)进行注册
values bdapinst.uuid();
select bdapinst.uuid() from SYSIBM.SYSDUMMY1;