“ORA-01747: user.table.column, table.column 或列说明无效” 的解决方案

简介:


 

此问题的原因是因为表的列名称使用了Oracle声明的关键字,列名起的不好引起的。

如果列很多,又不好确定是哪个列名使用了关键字,以下建议可供参考:

1
2
3
4
5
6
select  from  v$reserved_words  where  keyword
in (
select  COLUMN_NAME
from  all_tab_columns
where  table_name =  'HP_FFS'  and  owner= '用户名大写'
);

 

 

  除了与oracle关键字段冲突错误外(select * from v$reserved_words;--查询oracle数据库关键字),还有一种可能是po映射时的字段是否与数据库中的字段匹配,包括检查有外键关联所关联的PO中的各个字段映射是否正确。

  此外,也有可能是SQL语句查询插入的列名的最后多了一个“,”逗号等原因,也会引起这种错误。

 

 

一些具体的解决方案建议:

 

情形1

1.创建表是不使用ORACLE的关键字作为表字段名。

 

2.oracle 表字段关键字的查询 : 把字段名加上双引号,并且严格区分大小写。

 

建议采用第一种方法解决,减少出现其他问题的几率。

 

情形2

 

1、首先我们要确认哪些字符串是Oracle的关键字,具体可通过Oracle提供的V$RESERVED_WORDS

2、对历史遗留系统的处理

  • 考虑修改表的列名,风险较大
  • 修改特定查询语句

3、验证

通过验证得出结论:

  • 在查询列中使用双引号
  • 要注意列的大小写
    1
     
1
2
3
4
5
6
7
8
9
10
CREATE  TABLE  WYC_TEST(CODE VARCHAR2(20), ADDR VARCHAR2(40));
     
INSERT  INTO  WYC_TEST(CODE,ADDR)  VALUES ( '00' 'ADDR00' );
ALTER  TABLE  WYC_TEST  ADD  "ROW"  VARCHAR2(20);
ALTER  TABLE  WYC_TEST  ADD  "Row"  VARCHAR2(20);
ALTER  TABLE  WYC_TEST  ADD  "RoW"  VARCHAR2(30);
INSERT  INTO  WYC_TEST(CODE,ADDR,  "ROW" VALUES ( '00' 'ADDR00' 'abc' );
UPDATE  WYC_TEST  SET  "ROW"  = WYC_TEST.ADDR ||  '_ROW' "Row" =WYC_TEST.ADDR ||  '_Row' "RoW" =WYC_TEST.ADDR ||  '_RoW'
 
SELECT  FROM  WYC_TEST;

 

 

 

 

参考文章:

1. 关于报错“ORA-01747: user.table.column, table.column 或列说明无效”的解决办法

2. ORA_01747:User.table.column 或列说明无效

3. ORA-01747: user.table.column, table.column 或列说明无效n, table.column 或列

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5734220.html ,如需转载请自行联系原作者


相关文章
|
7月前
|
索引
不推荐SELECT * FROM table原因
根据非索引查询 :B+树的叶子节点放数据表行数据,叶子节点存放主键,如果想获得行数据信息,则需要再跑到主键索引去拿数据,这叫回表,速度慢。但不管是主键还是非主键索引,他们的叶子结点数据都是有序的。比如在主键索引中,这些数据是根据主键id的大小,从小到大,进行排序的。**1.**根据索引查询 :B+树的父节点放索引数据,速度快,叶子(父)节点会存放完整的行数据西信息。
347 0
|
6月前
|
数据库 OceanBase
使用 `INSERT INTO table_name SELECT * FROM table_name` 这种方式
使用 `INSERT INTO table_name SELECT * FROM table_name` 这种方式
45 1
|
7月前
|
数据库 OceanBase
INSERT INTO table_name SELECT * FROM table_name
INSERT INTO table_name SELECT * FROM table_name
36 1
|
关系型数据库 MySQL 索引
浅谈create table as 和 insert into select 复制表遇到的问题
之前做一次表压缩测试,在准备原表时需要数据量比较大的表,通过insert into select 的方式将几个表的数据复制到一个表,产生的一些问题~
3130 0
|
Web App开发 前端开发 搜索推荐