【问题标题】:Oracle Alter command to rename existing Column errorringOracle Alter 命令重命名现有的列错误
【发布时间】:2018-05-10 20:06:02
【问题描述】:
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
【问题讨论】:
标签:
oracle
alter
identity-column
【解决方案1】:
使用错误消息中提到的表名在您的数据库中运行以下 SQL 查询。例如,在本文显示的错误消息中,表名是“tablename”。请注意,虽然表名在错误消息中显示为小写,但在您的数据库中可能为大写。此查询区分大小写,因此如果您没有收到任何结果,请检查数据库中的表名是否为大写。
选择 COLUMN_NAME、DATA_DEFAULT、HIDDEN_COLUMN
FROM USER_TAB_COLS
WHERE TABLE_NAME = '表名';
在继续之前,请确保 Bitbucket 服务器进程未运行。如果已启用扩展统计信息,请联系您的数据库管理员,让他们从表中删除扩展统计信息元数据,然后继续升级。如果您希望在升级后再次启用扩展统计信息,您可以这样做,但请注意,您可能需要再次重复此过程以进行后续升级,否则您可能会再次遇到此问题。
删除由扩展统计创建的列需要使用内置存储过程,
DBMS_STATS.DROP_EXTENDED_STATS()。
ORA-54033 和 Hidden Virtual Column Mystery 进一步介绍了此存储过程的使用,类似于以下内容:
EXEC DBMS_STATS.DROP_EXTENDED_STATS(ownname=>'<YOUR_DB_USERNAME>', tabname=>'tablename', extension=>'("PR_ROLE", "USER_ID", "PR_APPROVED")')
参考资料
Database Upgrade Eror: column to be rename
谢谢。
【解决方案2】:
大概,你有这样一张桌子:
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_nbr 列用于虚拟(zl_divn_percent) 列的计算。
要重命名zl_divn_nbr,所有引用到该列的虚拟列都应该被删除,并且可以在以后创建。
定义虚拟列的语法是这样的:
column_name [datatype] [GENERATED ALWAYS] AS (expression) [VIRTUAL]
从版本 11 R1 开始,我们就有了这个属性。
【解决方案3】:
ALTER TABLE 将列重命名为
对于具有虚拟或“组扩展列”的表,上述情况
语句在 Oracle 12cR2 之前返回错误。对于 Oracle 12cR2 或更新版本,上述语句运行良好,因为“重命名列”命令与组扩展方面分离。