Oracle Alter命令重命名现有的列错误环

Pra*_*nth 8 oracle alter identity-column

alter table tablename rename column zl_divn_nbr to div_loc_nbr;
Run Code Online (Sandbox Code Playgroud)

执行以上语句时出错。请帮忙。

SQL Error: ORA-54032: column to be renamed is used in a virtual column expression
54032. 0000 -  "column to be renamed is used in a virtual column expression"
*Cause:    Attempted to rename a column that was used in a virtual column
           expression.
*Action:   Drop the virtual column first or change the virtual column
           expression to eliminate dependency on the column to be renamed
Run Code Online (Sandbox Code Playgroud)

C P*_*kas 8

使用错误消息中提到的表名称在数据库中运行以下SQL查询。例如,在本文显示的错误消息中,表名是“ tablename”。请注意,虽然表名在错误消息中以小写形式出现,但在您的数据库中可能是大写形式。该查询区分大小写,因此,如果没有收到结果,请检查表名在数据库中是否为大写。

在TABLE_NAME ='tablename'的情况下,从USER_TAB_COLS中选择COLUMN_NAME,DATA_DEFAULT,HIDDEN_COLUMN

在继续之前,请确保Bitbucket Server进程未运行。如果启用了扩展统计信息,请与数据库管理员联系以使他们从表中删除扩展统计信息元数据,然后继续进行升级。如果您希望在升级后再次启用扩展统计信息,则可以这样做,但是请注意,您可能需要再次重复此过程以进行后续升级,否则可能会再次遇到此问题。

删除由扩展统计信息创建的列需要使用内置存储过程,

DBMS_STATS.DROP_EXTENDED_STATS()。

ORA-54033和“隐藏的虚拟列之谜”进一步介绍了此存储过程的用法,其外观类似于以下内容:

EXEC DBMS_STATS.DROP_EXTENDED_STATS(ownname=>'<YOUR_DB_USERNAME>', tabname=>'tablename', extension=>'("PR_ROLE", "USER_ID", "PR_APPROVED")')
Run Code Online (Sandbox Code Playgroud)

参考 数据库升级错误:要重命名的列

谢谢。


Bar*_*han 1

也许,你有这样一张表:

CREATE TABLE tablename(
  id               NUMBER,
  zl_divn_nbr      NUMBER,
  zl_divn_percent  NUMBER GENERATED ALWAYS AS (ROUND(zl_divn_nbr/100,2)) VIRTUAL
);
Run Code Online (Sandbox Code Playgroud)

其中zl_divn_nbrcolumn用于计算virtual( zl_divn_percent)列。

要重命名zl_divn_nbr,应删除此列的所有引用虚拟列,并且可以稍后创建。

定义虚拟列的语法是这样的:

column_name [datatype] [GENERATED ALWAYS] AS (expression) [VIRTUAL]
Run Code Online (Sandbox Code Playgroud)

从版本 11 R1 开始,我们就有了这个属性。