4

1または0を返すユーザー定義のSQL関数があり、列のCHECK制約から呼び出したいと思います。

4

1 に答える 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 に答える