代码之家  ›  专栏  ›  技术社区  ›  Wekerle Tibor

Oracle sql,更改约束而不指定其名称

  •  0
  • Wekerle Tibor  · 技术社区  · 6 年前

    我想在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';
    

    它不工作,我有以下错误

    enter image description here

    select单独运行正常,返回正确的值。如何使用正确的语法来处理alter语句?

    2 回复  |  直到 6 年前
        1
  •  3
  •   MT0    6 年前

    您可以使用动态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
  •  2
  •   Connor McDonald    6 年前

    和使用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.