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 回答