代码之家  ›  专栏  ›  技术社区  ›  Breck Carter

可以从列检查约束调用用户定义函数吗?

  •  4
  • Breck Carter  · 技术社区  · 17 年前

    我有一个用户定义的sql函数,它返回1或0,我想从列检查约束调用它。

    1 回复  |  直到 17 年前
        1
  •  4
  •   Breck Carter    17 年前

    对。sql anywhere没有布尔数据类型,因此必须对产生true、false或unknown的谓词进行编码。换句话说,如果函数返回1或0表示通过或失败,则必须将约束编码为check(f()=1)。

    请注意,true和unknown都会导致“通过”;只有false结果会导致检查失败。

    下面的示例演示如何更改已包含数据的表,以添加具有此类检查约束的列。

    布雷克

    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;