Как сохранить пробелы в аргументах функции в 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.
Другие вопросы по тегам