此问题的原因是因为表的列名称使用了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.
2.
3.