Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2880600
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2012-08-24 21:35:45

采用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才行。



 
阅读(2266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~