Db2 在函数中使用REPLACE()将半宽字符转换为全宽字符时,如果不声明“CONTAINS SQL”,则无法执行此操作

Db2 在函数中使用REPLACE()将半宽字符转换为全宽字符时,如果不声明“CONTAINS SQL”,则无法执行此操作,db2,Db2,我们使用REPLACE将作为参数传递的字符串从半宽字符转换为全宽字符,并使用REPLACE替换所有半宽字符。 最后,返回一个字符串,其中半宽字符转换为全宽字符 创建此函数时,如果未声明包含SQL,则无法使用此函数。在被调用的过程中发生编译错误,以便在处理时使用此函数 其他存储过程。声明前后的结果不同 create or replace procedure zz_kit( out O_VALUE1 VARCHAR(20000), OUT O_VALUE2 VARCHAR(20000

我们使用REPLACE将作为参数传递的字符串从半宽字符转换为全宽字符,并使用REPLACE替换所有半宽字符。 最后,返回一个字符串,其中半宽字符转换为全宽字符

创建此函数时,如果未声明包含SQL,则无法使用此函数。在被调用的过程中发生编译错误,以便在处理时使用此函数 其他存储过程。声明前后的结果不同

    create or replace procedure zz_kit(
    out O_VALUE1 VARCHAR(20000), OUT O_VALUE2 VARCHAR(20000)    
    )
    SPECIFIC zz_kit

    P1:BEGIN
    --123456ABCDEF   ->123456ABCABC
    update TBL_MEM_ACC SET FILLER1 = FNC_NAME2('A');
    set O_VALUE1=FNC_NAME('A');
    set O_VALUE2=FNC_NAME2('A');
    END P1
通过声明“CONTAINS SQL”并创建一个函数,我们可以使用SQL从存储过程调用函数,例如更新表

通过不声明“包含SQL”,更新表不起作用

未处理该语句,因为函数FNC_NAME2 已解析为在中无效的特定函数FNC_NAME2 使用它的上下文。。。SQLCODE=-390,SQLSTATE=42887, 驱动器=4.24.92

当简单地尝试将函数的结果存储在存储过程中的变量中作为set O_VALUE1=FNC_NAME'a时,返回的内容将是相同的,它正在工作

从命令行运行时

db2 "select FNC_NAME('1234ABCDE') from sysibm.sysdummy1"
db2 "select FNC_NAME2('1234ABCDE') from sysibm.sysdummy1"
当运行上述函数时,无论是否声明“CONTAINS SQL”,结果都是不同的。声明和部署“CONTAINS SQL”时,并非所有字符都转换为全宽字符 但是会返回处理结果

----WITH包含SQL--------------------------------------

CREATE OR REPLACE FUNCTION FNC_NAME(
IN I_ORG_STR   VARCHAR(5000)
)
RETURNS VARCHAR(20000)
SPECIFIC FNC_NAME
LANGUAGE SQL
CONTAINS SQL

BEGIN
DECLARE V_D_CNT INTEGER;
DECLARE V_HD_CNT INTEGER;
DECLARE V_RESULT VARCHAR(20000) DEFAULT NULL;

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RETURN V_RESULT;
END;

IF I_ORG_STR IS NULL OR I_ORG_STR = '' THEN
RETURN V_RESULT;
END IF;

SET V_RESULT = I_ORG_STR;
SET V_RESULT = REPLACE(V_RESULT, '  ', '');
SET V_RESULT = REPLACE(V_RESULT, ' ', '');

SET V_RESULT = TRANSLATE(V_RESULT);

SET V_RESULT = REPLACE(V_RESULT, 'a', 'A');
SET V_RESULT = REPLACE(V_RESULT, 'b', 'B');
SET V_RESULT = REPLACE(V_RESULT, 'c', 'C');
SET V_RESULT = REPLACE(V_RESULT, 'd', 'D');
SET V_RESULT = REPLACE(V_RESULT, 'e', 'E');

SET V_RESULT = REPLACE(V_RESULT, '0', '0');
SET V_RESULT = REPLACE(V_RESULT, '1', '1');
SET V_RESULT = REPLACE(V_RESULT, '2', '2');
SET V_RESULT = REPLACE(V_RESULT, '3', '3');
SET V_RESULT = REPLACE(V_RESULT, '4', '4');


SET V_D_CNT = POSSTR(V_RESULT, '.');
IF V_D_CNT > 0 THEN
SET V_RESULT = REPLACE(V_RESULT, '.','.');
END IF;

RETURN V_RESULT;
END
CREATE OR REPLACE FUNCTION FNC_NAME2(
IN I_ORG_STR   VARCHAR(5000)
)
RETURNS VARCHAR(20000)
SPECIFIC FNC_NAME2
LANGUAGE SQL
--CONTAINS SQL

BEGIN
DECLARE V_D_CNT INTEGER;
DECLARE V_HD_CNT INTEGER;
DECLARE V_RESULT VARCHAR(20000) DEFAULT NULL;

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RETURN V_RESULT;
END;

IF I_ORG_STR IS NULL OR I_ORG_STR = '' THEN
RETURN V_RESULT;
END IF;

SET V_RESULT = I_ORG_STR;
SET V_RESULT = REPLACE(V_RESULT, '  ', '');
SET V_RESULT = REPLACE(V_RESULT, ' ', '');

SET V_RESULT = TRANSLATE(V_RESULT);

SET V_RESULT = REPLACE(V_RESULT, 'a', 'A');
SET V_RESULT = REPLACE(V_RESULT, 'b', 'B');
SET V_RESULT = REPLACE(V_RESULT, 'c', 'C');
SET V_RESULT = REPLACE(V_RESULT, 'd', 'D');
SET V_RESULT = REPLACE(V_RESULT, 'e', 'E');

SET V_RESULT = REPLACE(V_RESULT, '0', '0');
SET V_RESULT = REPLACE(V_RESULT, '1', '1');
SET V_RESULT = REPLACE(V_RESULT, '2', '2');
SET V_RESULT = REPLACE(V_RESULT, '3', '3');
SET V_RESULT = REPLACE(V_RESULT, '4', '4');


SET V_D_CNT = POSSTR(V_RESULT, '.');
IF V_D_CNT > 0 THEN
SET V_RESULT = REPLACE(V_RESULT, '.','.');
END IF;

RETURN V_RESULT;
END
------不包含SQL------------------------------------

CREATE OR REPLACE FUNCTION FNC_NAME(
IN I_ORG_STR   VARCHAR(5000)
)
RETURNS VARCHAR(20000)
SPECIFIC FNC_NAME
LANGUAGE SQL
CONTAINS SQL

BEGIN
DECLARE V_D_CNT INTEGER;
DECLARE V_HD_CNT INTEGER;
DECLARE V_RESULT VARCHAR(20000) DEFAULT NULL;

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RETURN V_RESULT;
END;

IF I_ORG_STR IS NULL OR I_ORG_STR = '' THEN
RETURN V_RESULT;
END IF;

SET V_RESULT = I_ORG_STR;
SET V_RESULT = REPLACE(V_RESULT, '  ', '');
SET V_RESULT = REPLACE(V_RESULT, ' ', '');

SET V_RESULT = TRANSLATE(V_RESULT);

SET V_RESULT = REPLACE(V_RESULT, 'a', 'A');
SET V_RESULT = REPLACE(V_RESULT, 'b', 'B');
SET V_RESULT = REPLACE(V_RESULT, 'c', 'C');
SET V_RESULT = REPLACE(V_RESULT, 'd', 'D');
SET V_RESULT = REPLACE(V_RESULT, 'e', 'E');

SET V_RESULT = REPLACE(V_RESULT, '0', '0');
SET V_RESULT = REPLACE(V_RESULT, '1', '1');
SET V_RESULT = REPLACE(V_RESULT, '2', '2');
SET V_RESULT = REPLACE(V_RESULT, '3', '3');
SET V_RESULT = REPLACE(V_RESULT, '4', '4');


SET V_D_CNT = POSSTR(V_RESULT, '.');
IF V_D_CNT > 0 THEN
SET V_RESULT = REPLACE(V_RESULT, '.','.');
END IF;

RETURN V_RESULT;
END
CREATE OR REPLACE FUNCTION FNC_NAME2(
IN I_ORG_STR   VARCHAR(5000)
)
RETURNS VARCHAR(20000)
SPECIFIC FNC_NAME2
LANGUAGE SQL
--CONTAINS SQL

BEGIN
DECLARE V_D_CNT INTEGER;
DECLARE V_HD_CNT INTEGER;
DECLARE V_RESULT VARCHAR(20000) DEFAULT NULL;

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RETURN V_RESULT;
END;

IF I_ORG_STR IS NULL OR I_ORG_STR = '' THEN
RETURN V_RESULT;
END IF;

SET V_RESULT = I_ORG_STR;
SET V_RESULT = REPLACE(V_RESULT, '  ', '');
SET V_RESULT = REPLACE(V_RESULT, ' ', '');

SET V_RESULT = TRANSLATE(V_RESULT);

SET V_RESULT = REPLACE(V_RESULT, 'a', 'A');
SET V_RESULT = REPLACE(V_RESULT, 'b', 'B');
SET V_RESULT = REPLACE(V_RESULT, 'c', 'C');
SET V_RESULT = REPLACE(V_RESULT, 'd', 'D');
SET V_RESULT = REPLACE(V_RESULT, 'e', 'E');

SET V_RESULT = REPLACE(V_RESULT, '0', '0');
SET V_RESULT = REPLACE(V_RESULT, '1', '1');
SET V_RESULT = REPLACE(V_RESULT, '2', '2');
SET V_RESULT = REPLACE(V_RESULT, '3', '3');
SET V_RESULT = REPLACE(V_RESULT, '4', '4');


SET V_D_CNT = POSSTR(V_RESULT, '.');
IF V_D_CNT > 0 THEN
SET V_RESULT = REPLACE(V_RESULT, '.','.');
END IF;

RETURN V_RESULT;
END
我们使用REPLACE将作为参数传递的字符串从半宽字符转换为全宽字符,并使用REPLACE替换所有半宽字符。最后,返回一个字符串,其中半宽字符转换为全宽字符。 这里的问题是,在声明“包含SQL”时,半宽字符只能替换为全宽字符?在函数或过程中?这是唯一的选择吗

环境:linux,迷你IIA

第一个结果是函数包含“contains SQL”
第二个结果是函数不包含“CONTAINS SQL”

问题在哪里?不确定我是否错过了。在您的系统中,sysibm.sysdummy1中的这两个select语句的结果是什么?你的“半宽”和“全宽”字符描述是什么?为什么要用相等的第2和第3个参数进行大量的REPLACE函数调用?您好,我们使用REPLACE将作为参数传递的字符串从半宽字符转换为全宽字符,并用REPLACE替换所有半宽字符。最后,返回一个字符串,其中半宽字符转换为全宽字符。这里的问题是,在声明“包含SQL”时,半宽字符只能替换为全宽字符?在函数或过程中?这是唯一添加的选项吗?问题中链接中的输出图像第一个结果是当函数包含“包含SQL”时第二个结果是当函数不包含“包含SQL”时@jhansiyugundreddy请编辑您的问题以添加Db2服务器版本、平台z/os、i-seriesas/400或linux/unix/windows。