DB2:未找到名为"EBCDIC_CHR"且类型为"FUNCTION"且具有兼容参数的授权例程



当我试图在DB2中创建一个定义的函数来将十六进制转换为字符串时,我遇到了以下问题:

SQL ERROR[42884]: No authorized routine named "EBCDIC_CHR" of type "FUNCTION" having compatible arguments was found..SQLCODE=-440,SQLSTATE=42884,DRIVER=4.19.66

代码的详细信息如下:

CREATE FUNCTION My_HEX2EBCDIC (I_STRING VARCHAR(50)) RETURNS VARCHAR(50)

BEGIN
DECLARE v_hex1 char(1);
DECLARE v_hex2 char(1);
DECLARE v_int INTEGER;
DECLARE v_start INTEGER;
DECLARE v_string varchar(50);
SET v_start = 1;
SET v_string = '';
WHILE v_start < length(I_string) DO
SET v_hex1 = substr(i_string,v_start,1);
SET v_hex2 = substr(i_string,v_start+1,1);
SET v_int = (locate(v_hex1,'0123456789ABCDEF') - 1 ) * 16 + locate(v_hex2,'0123456789ABCDEF') - 1 ;
set v_string = v_string || EBCDIC_CHR(v_int);  // error
SET v_Start = v_Start + 2;
END WHILE;
return v_String;
END

我不知道为什么,我该怎么解决!请帮帮我,谢谢!

在用于LUW标量函数的DB2中,没有DB2 for Z/OS EBCDIC_CHR这样的函数
DB2 for Z/OS和DB2 for LUW是不同的产品,它们的内置函数集略有不同。

实现目标的最简单方法是创建一个通用的javaUDF。

public class Convert 
{
public static byte[] char2byte(String str, String enc) throws java.io.UnsupportedEncodingException 
{
return str.getBytes(enc);
}
public static String byte2char(byte[] b, String enc) throws java.io.UnsupportedEncodingException 
{
return new String(b, enc);
}
}

编译具有以下内容的Convert.java文件,并将Convert.class文件放在~db2instance/sqllib/function目录中,使其对~db2instance/sqllib/adm/.fenced文件所有者(db2 fenced用户(可读。

使用以下类创建两个javaUDF:

create function byte2char(bytes varchar(32672) for bit data, enc varchar(16))
RETURNS varchar(32672)
LANGUAGE JAVA
EXTERNAL NAME 'Convert.byte2char'
DETERMINISTIC
FENCED THREADSAFE
NO SQL
NOT NULL CALL
NO EXTERNAL ACTION
ALLOW PARALLEL
PARAMETER STYLE JAVA;
create function char2byte(str varchar(32672), enc varchar(16))
RETURNS varchar(32672) for bit data
LANGUAGE JAVA
EXTERNAL NAME 'Convert.char2byte'
DETERMINISTIC
FENCED THREADSAFE
NO SQL
NOT NULL CALL
NO EXTERNAL ACTION
ALLOW PARALLEL
PARAMETER STYLE JAVA;

看起来,您提供的十六进制字符串表示是针对1381、1383或1386代码页之一的
如果是,请尝试以下操作:

VALUES BYTE2CHAR(HEXTORAW('D6A7B8B6503031'), 'IBM-1381')

最新更新