При использовании REPLACE () для преобразования символов половинной ширины в символы полной ширины, в функции это невозможно сделать без объявления 'CONTAINS SQL' - PullRequest
0 голосов
/ 09 марта 2020

мы использовали REPLACE () для преобразования строки символов, переданной в качестве аргумента, из символов полуширины в символы полной ширины (замените все символы полуширины на REPLACE ()). Наконец, в результате возвращается строка символов, в которой символы половинной ширины преобразуются в символы полной ширины.

При создании этой функции ее нельзя использовать без объявления «CONTAINS 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' и создавая FUNCTION, мы смогли вызвать FUNCTION из хранимой процедуры с помощью SQL например, обновление таблицы

create or replace procedure zz_kit2(
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', обновление таблицы не работает

Оператор был не обработан, поскольку функция "FNC_NAME2" разрешена для указания c функции "FNC_NAME2", которая недопустима в контексте, где она используется ... SQLCODE = -390, SQLSTATE = 42887, DRIVER = 4.24.92


create or replace procedure zz_kit2(
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

при простой попытке сохранить результат FUNCTION в переменной в хранимой процедуре, как установлено 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 CONTAINS 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

----------- БЕЗ СОДЕРЖИТ SQL ---- -------------------------------------------------- -----------------

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 ()). Наконец, в результате возвращается строка символов, в которой символы половинной ширины преобразуются в символы полной ширины. Вопрос здесь заключается в том, что символы половинной ширины можно заменить только символами полной ширины при объявлении «CONTAINS SQL»? в функции или процедуре? это единственная опция

env: linux, mini IIAS введите описание изображения здесь

Первый результат, когда функция содержит 'CONTAINS SQL', второй результат когда функция не содержит 'CONTAINS SQL'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...