Да. SQL Anywhere не имеет логического типа данных, поэтому вы должны кодировать предикат, который возвращает TRUE, FALSE или UNKNOWN. Другими словами, если ваша функция возвращает 1 или 0 для передачи или неудачи, вы должны закодировать ограничение как CHECK (f () = 1).
Обратите внимание, что ИСТИНА и НЕИЗВЕСТНО оба приводят к "проходу"; только результат FALSE приводит к сбою проверки.
В следующем примере показано, как изменить таблицу, которая уже содержит данные, чтобы добавить столбец с таким ограничением CHECK.
Брек
CREATE TABLE t (
pkey INTEGER NOT NULL PRIMARY KEY );
INSERT t VALUES ( 1 );
COMMIT;
CREATE FUNCTION is_filled_in (
IN @value VARCHAR ( 100 ) )
RETURNS TINYINT
BEGIN
IF COALESCE ( @value, '' ) <> '' THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
ALTER TABLE t ADD c VARCHAR ( 3 ) DEFAULT 'xxx'
CHECK ( is_filled_in ( c ) = 1 );
-- Works ok...
INSERT t VALUES ( 2, 'yyy' );
COMMIT;
-- Throws SQLCODE -209 Invalid value for column 'c' in table 't'...
INSERT t VALUES ( 3, '' );
COMMIT;
SELECT * FROM t;