此问题的原因是因为表的列名称使用了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
,如需转载请自行联系原作者