【问题标题】:Oracle sql, alter constraint without specifying it's nameOracle sql,更改约束而不指定其名称
【发布时间】:2018-04-19 08:11:58
【问题描述】:

我想在 oracle 数据库中重命名一个约束,但不指定它的名称,而是选择它的名称。我想做这样的事情:

ALTER TABLE O4Y_USER RENAME CONSTRAINT
    (SELECT constraint_name
            FROM user_constraints
            WHERE table_name    = 'O4Y_USER'
            AND constraint_type = 'P'
     ) TO 'O4Y_USER_PK';

它不工作,我有以下错误

单独的选择运行良好,它返回正确的值。使用 alter 语句的正确语法是怎样的?

【问题讨论】:

    标签: oracle dynamic-sql ddl alter-table


    【解决方案1】:

    您可以使用动态 SQL。比如:

    DECLARE
      p_constraint_name VARCHAR2(30);
      p_sql             VARCHAR2(4000);
    BEGIN
      SELECT constraint_name
      INTO   p_constraint_name
      FROM   user_constraints
      WHERE  table_name    = 'O4Y_USER'
      AND    constraint_type = 'P';
    
      p_sql := 'ALTER TABLE O4Y_USER RENAME CONSTRAINT "'
               || p_constraint_name
               || '" TO ''O4Y_USER_PK''';
    
      DBMS_OUTPUT.PUT_LINE( p_sql );
      EXECUTE IMMEDIATE p_sql;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE( 'Constraint not found!' );
    END;
    /
    

    【讨论】:

      【解决方案2】:

      使用 SQL*Plus 或类似命令行工具的方法相同。

      SQL> create table t ( x int primary key );
      
      Table created.
      
      SQL>
      SQL> col cname new_value x
      SQL>
      SQL> SELECT constraint_name cname
        2  FROM   user_constraints
        3  WHERE  table_name    = 'T'
        4  AND    constraint_type = 'P';
      
      CNAME
      ----------------------------------------------------------------------
      SYS_C0068724
      
      SQL>
      SQL> ALTER TABLE t RENAME CONSTRAINT &&x to my_new_name;
      old   1: ALTER TABLE t RENAME CONSTRAINT &&x to my_new_name
      new   1: ALTER TABLE t RENAME CONSTRAINT SYS_C0068724 to my_new_name
      
      Table altered.
      

      【讨论】:

        猜你喜欢
        • 2017-04-18
        • 2013-04-18
        • 2018-12-31
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多