Oracle的ALTER命令用于重命名现有列时错误了。

10
alter table tablename rename column zl_divn_nbr to div_loc_nbr;

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

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

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

SELECT COLUMN_NAME, DATA_DEFAULT, HIDDEN_COLUMN FROM USER_TAB_COLS WHERE TABLE_NAME = 'tablename';

在继续之前,请确保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")')

参考资料 数据库升级错误:将被重命名的列用于虚拟列表达式

谢谢。


1
可能您有这样的一个表格:

CREATE TABLE tablename(
  id               NUMBER,
  zl_divn_nbr      NUMBER,
  zl_divn_percent  NUMBER GENERATED ALWAYS AS (ROUND(zl_divn_nbr/100,2)) VIRTUAL
);

当计算虚拟列(zl_divn_percent)时,使用了 zl_divn_nbr 列。

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

定义虚拟列的语法如下:

column_name [datatype] [GENERATED ALWAYS] AS (expression) [VIRTUAL]

自11 R1版本以来,我们拥有了这个属性。

0

ALTER TABLE 重命名列为

在具有虚拟或“分组扩展列”表的情况下,在Oracle 12cR2之前,以上语句会返回错误。对于Oracle 12cR2或更新版本,以上语句可以正常运行,因为“重命名列”命令与分组扩展方面解耦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接