我有一个用户定义的 SQL 函数,它返回 1 或 0,我想从列 CHECK 约束中调用它。
问问题
5147 次
1 回答
4
是的。SQL Anywhere 没有布尔数据类型,因此您必须编写一个产生 TRUE、FALSE 或 UNKNOWN 的谓词。换句话说,如果您的函数返回 1 或 0 表示通过或失败,您必须将约束编码为 CHECK ( f() = 1 )。
请注意,TRUE 和 UNKNOWN 都会导致“通过”;只有 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;
于 2009-05-04T12:30:53.497 回答