0

すべての数値列に制約を設定する必要があります。これが私が試したものです:すべてが正でなければなりません

ALTER TABLE * ADD CONSTRAINT Checknumbers CHECK ( > 0 )

これは機能していませんが、解決策が見つかりません。

私が使用できる他の構文はありますか、それともテーブルごとに手動で行う必要がありますか?

4

1 に答える 1

4

各テーブルの列ごとに個別の制約を作成する必要があります。このための動的 SQL を少し書くことができます。

DECLARE
  l_sql_stmt VARCHAR2(1000);
BEGIN
  FOR x IN (SELECT *
              FROM user_tab_columns
             WHERE data_type = 'NUMBER'
               AND table_name in (SELECT table_name
                                    FROM user_tables
                                   WHERE dropped = 'NO' )
  LOOP
    l_sql_stmt := 'ALTER TABLE ' || x.table_name || 
                  '  ADD CONSTRAINT chk_' || x.table_name || '_' || x.column_name ||
                  ' CHECK( ' || x.column_name || ' > 0)';
    EXECUTE IMMEDIATE l_sql_stmt;
  END LOOP;
END;

現在のスキーマのすべてのテーブルのすべての数値列に対して、チェック制約の作成が試行されます。制約名は 30 文字に制限されているため、テーブル名と列名の長さの合計が 25 を超える場合、無効な識別子を生成しようとします。制約名を生成する別の方法を見つける必要があります (または、システムに名前を生成させることもできます)。また、大文字と小文字を区別する識別子を持っている場合、これはそれらを処理しません。それが問題になる場合は、識別子を二重引用符で囲む必要があります。

于 2013-06-13T07:01:17.727 に答える