有人在Itpub上问Oracle 817建分区表怎么出错了? 错误如下:
ORA-00604: error occurred at recursive SQL level 1
ORA-00904: invalid column name
通过设置SQL跟踪, 发现了引起错误的SQL语句.
PARSE ERROR #5:len=127 dep=1 uid=0 oct=2 lid=0 tim=0 err=904
insert into partcol$ (obj#, intcol#, col#, pos#, spare1, segcol#,
type#, charsetform) values (:1, :2, :3, :4, :5, :6, :7, :8)
看一下现在的partcol$表的表结构.
SQL> desc sys.partcol$
Name Type Nullable Default Comments
------- ------ -------- ------- --------
OBJ# NUMBER
INTCOL# NUMBER
COL# NUMBER
POS# NUMBER
SPARE1 NUMBER Y
原来是这个系统表少了几个列, 什么原因造成的呢? 我首先想到的就是升级时只升了软件, 没有运行Oracle的升级角本. 我们可以在rdbms/admin目录下grep下这个表. 主要有三个角本包含了对这个表的结构修改.
c0801060.sql:alter table partcol$ add (segcol# number, ...
migrate.bsq:create table partcol$ (
sql.bsq:create table partcol$ (
通过进一步对比, 发现这实例中的表结构和migrate.bsq中的一致, 因此初步确定这是一个从Oracle 7升级上来的数据库. 看谁在调用c0801060这个SQL文件.
u0801060.sql:Rem STAGE 3: call c0801060.sql:
u0801060.sql:@@c0801060
可以看到Oracle在从816升到817时需要加这三个列, 而出现这个错误的原因也是因为只是将Oracle执行文件升级到817了,而没有在Oracle数据库里跑升级角本u0801070. 是谁在提供这样的技术支持? 新瓶装旧酒!