Как сохранить пробелы в аргументах функции в Informix?
Я пытаюсь создать версию функции InStr для Informix 11.5. Вот код:
CREATE FUNCTION MY_INSTR(txt VARCHAR(255), term VARCHAR(255))
RETURNING VARCHAR(255);
DEFINE i INTEGER;
DEFINE len INTEGER;
DEFINE lenterm INTEGER;
LET i = 1;
LET lenterm = LENGTH(term);
LET len = LENGTH(txt) - lenterm;
WHILE ( i <= len ) LOOP
IF SUBSTR( txt, i, lenterm ) = term THEN
RETURN i;
END IF
LET i = i + 1;
END LOOP
RETURN 0;
END FUNCTION;
Я буду использовать эту функцию, чтобы получить имя пользователя в столбце с полным именем, например так:
SELECT SUBSTR(name, 1, MY_INSTR(name, " ")) AS firstname
FROM users
Мне нужно передать значение " "
как термин, но когда я делаю, lenterm
равно 0
Есть ли способ сохранить пробелы при передаче их функции в Informix?
1 ответ
Решение
За VARCHAR
типы, OCTET_LENGTH
Функция должна возвращать длину, включая завершающие пробелы. Из руководства:
OCTET_LENGTH возвращает количество байтов в символьном столбце, включая любые конечные пробелы.
У меня не было экземпляра informix 11.50 для тестирования, но я попробовал следующее в Informix 12.10 (FC6DE):
CREATE FUNCTION f_my_t(param1 VARCHAR(10))
RETURNING INTEGER AS param1_length;
DEFINE l_result INTEGER;
LET l_result = OCTET_LENGTH(param1);
RETURN l_result;
END FUNCTION;
EXECUTE FUNCTION f_my_t (' ');
Результат, который я получил:
Database selected.
Routine created.
param1_length
1
1 row(s) retrieved.
Database closed.