文章目录


因为种类比较多,建议摘要里面记录下,有可能能搜到。

报错:ORA-00923: 未找到要求的 FROM 关键字

这是最基本的报错了。
一般是因为语句不正确。
例如: sql语句列少了个逗号

报错: ORA-00909: 参数个数无效

一般是使用函数的时候,参数个数不对。

RA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务

找到oracle安装目录下的listener.ora 文件,如地址为:
F:\app\chushiyun\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
添加:

(SID_DESC =
    (GLOBAL_DBNAME = ORCL)
    (ORACLE_HOME = F:\app\chushiyun\product\11.2.0\dbhome_1)  
    (SID_NAME = ORCL)
)

重启listener即可。

docker的oracle11g listener.ora :

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
    )
  )

ORA-02083: database name has illegal character ’ ’

在创建dblink的时候报这个错。
首先要注意别有特殊字符。
然后还是不行。
百度下说是跟GLOBAL_NAME有关。

OCI_INVALID_HANDLE

场景: 执行sql出现这个提示
关闭连接,然后重新打开,还是这样。 发现是vpn没有连接。
一般是连接不上的问题。

ORA-00028: your session has been killed

session被杀掉。
一般出现在执行某个sql操作的时候,session突然被杀掉,导致页面一直无法获取响应。
刷新下即可。

ORA-00001: unique constraint (USER.UIDX_USER_CODE_NUM) violated

这是因为插入的时候,违反唯一约束的原则。
但是为什么update的时候也会报这个错啊?
这个也是有可能的,例如除了id之外还有code,number的联合主键。 需要根据id,修改code或者number,这个时候修改的code或number有可能会和已存在的冲突。

无法将null插入 .

说明该字段是主键,或者限制了非空。
这个问题不只出现在oracle中。

ORA-02289: sequence does not existORA-02289: sequence does not exist

一看就是少了sequence。

create sequence T_USER_SEQ
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
cache 20;

ORA-01830: 日期格式图片在转换整个输入字符串之前结束

使用to_char 或 to_date的时候出现这个问题。

ORA-01843:无效的月份 和 ORA-01855:要求 AM/A.M. 或 PM/P.M.

-- 原sql:  
'01-SEP-20 11.37.50.000000 AM',
报错:ORA-01843:无效的月份
-- 调整后sql(这里改了月份):  
'01-9月 -20 09.20.47.000000 AM',
还是报错:ORA-01855:要求 AM/A.M. 或 PM/P.M.
-- 最终sql(这里把AM改为上午):  
'01-9月 -20 09.20.47.000000 上午'

注: 其实只要把数据库的格式查出来,参照着写即可。

ORA-01839: date not valid for month specified

日期对于指定的月份无效。

提示的已经很明确了,例如:
一般来说30号是正确的,但是2月没有30号,如果日期为2023-02-30就会报这个错。

ORA-12505:tns:监听程序当前无法识别链接描述符中锁给出的SID

1、oracle服务可能挂了。
2、oracle监听启动没。
3、sid确实写错了?

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

创建索引语句的时候报这个错:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

可能是因为改表有数据正被锁定,查询锁表并kill掉session即可。

ORA-01034: ORACLE not available

oracle命令行,输入关闭命令的时候报这个错,例如 shutdown immediate
可能原因,oracle服务根本就没启动,输入shutdown当然报错了,直接输入startup即可。

ORA-30484: 丢失的此函数窗口说明

执行的语句为:

select category,price,ROW_NUMBER()
from t_prodt_product

报错提示信息:
ORA-30484: 丢失的此函数窗口说明

这是因为ROW_NUMBER() 是配合开窗函数使用的。
这里语法显然不对。

ORA-01747: user.table.column, table.column 或列说明无效 异常解决方法总结

一般是字段名和oracle的关键字名冲突了。
执行以下语句查看关键字有哪些,然后对比下:

select * from v$reserved_words;    

方案一:修改字段名为非关键字(推荐)
方案二:关键字字段使用的时候要加双引号(比较麻烦,不推荐)

报错 ORA-00972: 标识符过长

创建触发器的时候提示: ORA-00972: 标识符过长
这是因为触发器的长度要求在30个字符以内,超过就会报这个错。
把名字改短点即可。

另外,表名长度过长也会报这个错。

ORA-01830: 日期格式图片在转换整个输入字符串之前结束

一般是日期格式不对,例如:
传入的是 ‘2021-06-15 00:00:00’,
用的函数是 create_date = to_date(#{createDate,jdbcType=VARCHAR},‘yyyy-MM-dd’),那么就会报错。

ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 CHAR ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 NUMBER

这2个是一类问题,说明类型不对应,一般出现在case when语句中。

ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 CHAR
case when route=100
then 100
else '50' end
AS route

该字段应该为number,但是返回的确是字符串,所以会报这个错。

ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 CHAR

相似,略。

ORA-01861: 文字与格式字符串不匹配

一般是类型不一致。
最常见的就是date和字符串不对应,优先查这个。
如果不是date的问题,那么再看其他的。

ORA-01810: 格式代码出现两次

说明oracle日期的格式化不正确,最常见的就是分钟mi错写为mm。

错误代码:
select to_date('2021-08-23 00:00:00','yyyy-MM-dd hh24:mm:ss')  from dual;

正确代码:
select to_date('2021-08-23 00:00:00','yyyy-MM-dd hh24:mi:ss')  from dual;

异常信息:ORA-02299: cannot validate (T_USER.UNIQUE_A_B) - duplicate keys found

一般是添加唯一约束时,有重复值。 删掉表的重复数据再试下。

ORA-06512、ORA-01830

ORA-06512: at line 6; nested exception is java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input string
一般是日期格式化不对。
例如:

SELECT to_date('2022-07-20 00:00:00','yyyy-mm-dd') FROM dual;

如果是在mybatis中,可以采用兼容性写法。 即: 可以先判断下长度,如果19位就用带时分秒的。

之前的写法:

<if test="createDate != null">
  CREATE_DATE = to_date(#{createDate,jdbcType=VARCHAR},'yyyy-mm-dd'),
</if>

兼容性写法:

<if test="createDate != null">
    <choose>
    	<when test="19==createDate.length">
    		CREATE_DATE = to_date(#{createDate,jdbcType=VARCHAR},'yyyy-mm-dd hh24:mi:ss'),
    	</when>
      <otherwise>
    	   CREATE_DATE = to_date(#{createDate,jdbcType=VARCHAR},'yyyy-mm-dd'),
    	</otherwise>
    </choose>
</if>
ORA-00918: 未明确定义列

注:刚看到时误以为是mybatis的问题,实际判断错误,这是oracle的错误。

这里有个细节。
sql直接查有重复列是不会报错的,如:

不报错:
SELECT 1 AS a ,2 AS a FROM dual

但是如果用到子表.*就会报错,因为.*的时候不知道选哪列了。

报错:
SELECT c.* FROM 
(SELECT 1 AS a ,2 AS a FROM dual) c

后来看了下,果然是列重复了,而mybatis一般会用分页插件,所以肯定带子表的查询,就报错了,这个报错不是出在该语句上,而是分页时的子表查询时

ORA-02287: 此处不允许序号

一般是在用sequence时,用到了限制的语法。

又遇到了这个问题,是在insert语句中使用seq时报的这个错。
按道理不应该啊,一般是在select语句中才会报这个错。例如:

SELECT AM_REALTION_SEQUENCE.nextval AS id FROM dual -- 正确

SELECT id FROM
(SELECT '1' AS id FROM dual) -- 正确

SELECT id FROM
(SELECT AM_REALTION_SEQUENCE.nextval AS id FROM dual) -- 错误

后来发现了问题所在,原来是实体类有pageNum,pageSize字段,如果字段完全命中,那么即使不使用PageHelper,也会自动分页

这样select 序列.nextval from dual外面就被包了一层分页的select,所以报错了。

下面算是标准文档吧,基本看不太懂,还是自己整理的能看懂。

看来序列使用时有限制的

看到书上说有这么多限制

Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the
following constructs:
■ A subquery in a DELETE, SELECT, or UPDATE statement
■ A query of a view or of a materialized view
■ A SELECT statement with the DISTINCT operator
■ A SELECT statement with a GROUP BY clause or ORDER BY clause    --这个就是我遇到的那种情况
■ A SELECT statement that is combined with another SELECT statement with the
UNION, INTERSECT, or MINUS set operator
■ The WHERE clause of a SELECT statement
■ The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
■ The condition of a CHECK constrain

 

总结,无法使用序列的CURRVAL 和NEXTVAL的情况为:

■ A subquery in a DELETE, SELECT, or UPDATE statement

(子查询包括在DELETE,SELECT,UPDATE语句中)
■ A query of a view or of a materialized view

(对视图和物化视图的查询)
■ A SELECT statement with the DISTINCT operator

(SELECT查询中用到了DISTINCT)
■ A SELECT statement with a GROUP BY clause or ORDER BY clause    --这个就是我遇到的那种情况SELECT查询中用到了GROUP BY ,ORDER BY )
■ A SELECT statement that is combined with another SELECT statement with the
UNION, INTERSECT, or MINUS set operator

(SELECT查询和其他SELECT查询结合,并且用到了UNION,INTERSECT,MINUS等操作)
■ The WHERE clause of a SELECT statement

(SELECT查询语句中的where条件不能用序列

例子:select 1 from dual where t_emp_calendar_seq.nextval = 95)
■ The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement

(??)
■ The condition of a CHECK constrain

(在CHECK限制条件中不能用)
oracle报错 ORA-00904: 标识符无效

可能是使用了关键字,例如uid
这是个保留字,返回当前用户的id。
如:select uid from dual;

oracle报错 ORA-02269: 关键字列不能是 LONG 数据类型

高版本的oracle不再支持long作为主键,如果主键类型再选long就会报错。
解决方案:
换为其他类型,例如Number(20,0)。

oracle报错 ORA-28000: the account is locked

很明显,账号被禁用了。

oracle报错 ORA-30926: unable to get a stable set of rows in the source tables

遇到的这个报错是出现在merge into语句中,如果数据有重复,那么就无法判断到底根据哪条来修改了,就会报这个错。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐