利用透明网关复制INFORMIX表到ORACLE导致列名为小写

2333阅读 0评论2012-08-24 TOMSYAN
分类:Oracle

采用CTAS方式,利用ORACLE的透明网关将INFORMIX数据库中的表迁移到ORACLE中后,
发现列都被置为了小写,如下:
 

点击(此处)折叠或打开

  1. SQL> desc PROJECTLIST
  2.  Name Null? Type
  3.  ----------------------------------------- -------- ----------------------------

  4.  projectname CHAR(180)
  5.  projectversion NOT NULL VARCHAR2(90)
  6.  productid NOT NULL CHAR(90)
  7.  times NOT NULL NUMBER(5)
  8.  username CHAR(120)
  9.  company CHAR(120)
  10.  updatedate DATE
  11.  primaryversion CHAR(90)
  12.  flag1 CHAR(90)
  13.  flag2 CHAR(90)
  14.  flag3 CHAR(90)
  15.  flag4 CHAR(90)
  16.  flag5
这将导致下面的查询失败:
 

点击(此处)折叠或打开

  1. SQL> select projectname from PROJECTLIST where rownum=1;
  2. select projectname from PROJECTLIST where rownum=1
  3.        *
  4. ERROR at line 1:
  5. ORA-00904: "PROJECTNAME": invalid identifier
必须将里面用引号引起来才行:

点击(此处)折叠或打开

  1. SQL> select "projectname" from PROJECTLIST where rownum=1;

  2. projectname
  3. --------------------------------------------------------------------------------

  4. TEST
除了通过ALTER TABLE RENAME COLUMN 的方法来修改之外,由于列名是记录到数据字典里的,我们可以通过修改数据字典信息来解决这个问题。
如下:
 

点击(此处)折叠或打开

  1. SQL> select object_id
  2.   2 from dba_objects where object_name='PROJECTLIST';

  3.            OBJECT_ID
  4. --------------------

  5.                53304

  6. SQL> select name
  7.   2 from sys.col$ where obj#=53304
  8.   3 order by col#;

  9. NAME
  10. ------------------------------------------------------------

  11. projectname
  12. projectversion
  13. productid
  14. times
  15. username
  16. company
  17. updatedate
  18. primaryversion
  19. flag1
  20. flag2
  21. flag3
  22. flag4
  23. flag5

  24. 13 rows selected.


  25. SQL> update sys.col$ set name=upper(name) where obj#=53304;

  26. 13 rows updated.

  27. SQL> set pagesize 30
  28. SQL> select name
  29.   2 from sys.col$ where obj#=53304
  30.   3 order by col#;

  31. NAME
  32. ------------------------------------------------------------

  33. PROJECTNAME
  34. PROJECTVERSION
  35. PRODUCTID
  36. TIMES
  37. USERNAME
  38. COMPANY
  39. UPDATEDATE
  40. PRIMARYVERSION
  41. FLAG1
  42. FLAG2
  43. FLAG3
  44. FLAG4
  45. FLAG5

  46. 13 rows selected.

  47. SQL> commit;

  48. Commit complete.
可以看到列名已经改回到大写。
 
再次执行查询:

 

点击(此处)折叠或打开

  1. SQL> select projectname from PROJECTLIST where rownum=1;
  2. select projectname from PROJECTLIST where rownum=1
  3.        *
  4. ERROR at line 1:
  5. ORA-00904: "PROJECTNAME": invalid identifier

  6. SQL> alter system flush shared_pool;

  7. System altered.

  8. SQL> select projectname from PROJECTLIST where rownum=1;

  9. PROJECTNAME
  10. --------------------------------------------------------------------------------

  11. TEST
 
第一次查询只所以报错是由于数据字典的信息已经缓存在row cache中,需要刷新一下Shared pool才行。



 
上一篇:安装ORACLE遇到libXp.so.6: cannot open shared object file
下一篇:取得块中行号的方法