мы использовали 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'