Oracle sql,在不指定名称的情况下更改约束

Oracle sql, alter constraint without specifying it's name

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

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';

它不工作,我有以下错误

select 单独运行良好,它 returns 是正确的值。如何使用正确的语法来运行 alter 语句?

您可以使用动态 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;
/

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