Можно ли вызвать пользовательскую функцию из ограничения CHECK столбца? - PullRequest
4 голосов
/ 04 мая 2009

У меня есть пользовательская функция SQL, которая возвращает 1 или 0, и я хочу вызвать ее из ограничения CHECK столбца.

1 Ответ

4 голосов
/ 04 мая 2009

Да. 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;
...