ORA-00000: normal, successful completion
Normal exit.
存储过程、PL/SQL块等,使用sqlerrm获取异常,如下例所示。【已验证】
declare
v_sqlcode number;
v_sqlerrm varchar2(4000); begin /* …… 相关执行代码 …… */ v_sqlcode := sqlcode; v_sqlerrm := sqlerrm; dbms_output.put_line('本次的异常code:' || v_sqlcode || chr(10) || '本次的异常信息:' || v_sqlerrm); exception when others then rollback; v_sqlcode := sqlcode; v_sqlerrm := sqlerrm; dbms_output.put_line('本次的异常code:' || v_sqlcode || chr(10) || '本次的异常信息:' || v_sqlerrm); end; /
使用OCI的C程序中,用erhms()函数(OCIErrorGet())获得Oracle错误信息。【未验证,网络汇总】
措施: 无。【如果是人为需要获取该异常,则不用做任何操作;如果是逻辑有误,那么需要调整不去此异常或者在遇到此异常时将其屏蔽去掉。】
None
hosts文件在不同系统中所处的目录:
Windows XP/2000/Vista/7/8/8.1/10 ==> C:\windows\system32\drivers\etc\
Linux及其他类Unix操作系统 ==> /etc/
ORA-00001: unique constraint (string.string) violated
An UPDATE or INSERT statement attempted to insert a duplicate key. For Trusted Oracle configured in DBMS MAC mode, you may see this message if a duplicate entry exists at a different level.
分析: 如下例所示,此异常一般为违反作用于表上的唯一约束或者主键约束导致,它们限制了表的一列或多列值的唯一性,不能插入重复数据。
-- 创建测试表
create table ora_00001_1( a char(24) /*primary key*/, -- 亦可加注释内信息实现添加主键约束 b number /*unique*/, -- 亦可加注释内信息实现添加唯一约束 -- 增加主键约束 constraint ora_00001_1_a primary key (a) -- 亦可加注释内信息实现添加唯一约束 /*, constraint ora_00001_1_b unique (b)*/ ); -- 亦可加注释内信息实现添加主键约束 /*alter table ora_00001_1 add constraint ora_00001_1_a primary key (a);*/ -- 增加唯一约束 alter table ora_00001_1 add constraint ora_00001_1_b unique (b); -- 插入测试数据 insert into ora_00001_1(a, b) values ('1',1); insert into ora_00001_1(a, b) values ('2',2); commit; -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_A); insert into ora_00001_1(a, b) values ('1',3); -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_B) insert into ora_00001_1(a, b) values ('3',2); -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_A) update ora_00001_1 set a = '1' where a = '2'; -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_B) update ora_00001_1 set b = '2' where b = '1';
措施: 删除唯一约束限制或不插入重复值。
Either remove the unique restriction or do not insert the key.
如果分析确定此处唯一约束或主键约束不需要,那么则可使用下面语句删除约束
-- 查询约束与索引信息
select a.owner 约束所有者, a.constraint_name 约束名, case a.constraint_type when 'P' then 'Primary key' when 'U' then 'Unique key' when 'C' then ' Check constraint on a table' when 'R' then 'Referential integrity' when 'V' then 'With check option, on a view' when 'O' then 'With read only, on a view' when 'H' then 'Hash expression' when 'F' then 'Constraint that involves a REF column' when 'S' then 'Supplemental logging' else 'unkown' end 约束类型, b.table_name 表名, b.column_name 列名, c.index_name 索引名, c.uniqueness 是否唯一索引/*, d.table_name 表名, d.column_name 列名*/ from user_constraints a, user_cons_columns b, user_indexes c/*, user_ind_columns d*/ where a.constraint_name = b.constraint_name and a.index_name = c.index_name /*and c.index_name = d.index_name*/ and a.owner = b.owner and a.owner = c.table_owner and a.owner = &"[拥有者]" and a.constraint_name = &"[约束名]"; -- 由于如果约束对应的唯一索引若是事先手工创建的,那么在删除约束时索引不会被删除,Oracle之后自动删除自己隐式创建的索引。 -- 因此加上drop index,可确保一定将索引删除。 alter table [表名] drop constraint [约束名] drop index; -- 如果是主键约束,有可能遇到有用作外键的情况,那么在删除时仍会报=>ORA-02273: 此唯一/主键已被某些外键引用 -- 报错后了解是否有问题,是否需去除此主键和外键,然后可考虑用下面语句删除主键约束,会同时删除外键约束 alter table [表名] drop constraint [约束名] cascade drop index; alter table [表名] drop primary key cascade drop index;
如果分析确定是值重复,那么需排查表数据与预执行的SQL语句的重复值冲突、同一个事务内执行的SQL语句之间的重复值冲突,去掉重复值的插入或更新。
备注:
ORA-00017: session requested to set trace event
The current session was requested to set a trace event by another session.
措施: 内部使用;无需操作。
This is used internally; no action is required.
ORA-00018: maximum number of sessions exceeded
All session state objects are in use.
措施: 增加SESSIONS初始化参数值。【是否需要增加SESSIONS值还需进行判断,是否是由于此值过小而现实场景需要更大的值?】
Increase the value of the SESSIONS initialization parameter.
如果判断确定是由于SESSIONS值过小导致,则需修改增大此参数值:
/*
alter system set 参数名=值 [scope=应用范围];
scope需知:
scope=both,表示修改会立即生效且会修改spfile文件以确保数据库在重启后也会生效如果(以spfile启动此项为缺省值);
scope=memory,表示修改会立即生效但不会修改spfile文件,因此重启后失效(以pfile启动此项为缺省值,且只可设置这个值);
scope=spfile,表示只修改spfile文件,在重启数据库后才生效(对应静态参数则只可设置此项值,设置其它值会报错:
ORA-02095: specified initialization parameter cannot be modified)。
*/
-- 查看"是否可用ALTER SYSTEM修改"列值,根据结果进行修改
select name 参数名, case type when 1 then 'Boolean' when 2 then 'String' when 3 then 'Integer' when 4 then 'Parameter file' when 5 then 'Reserved' when 6 then 'Big integer' else 'unknown' end 参数类型, value "会话级(若可修改)或实例级参数值", display_value 展示值, isses_modifiable "是否可用ALTER SESSION修改", case issys_modifiable when 'IMMEDIATE' then '无论pfile还是spfile启动,都可用"alter system set ' || name || '=&' || '新的参数值;"更改参数并立即生效。' when 'DEFERRED' then '无论pfile还是spfile启动,都可用"alter system set ' || name || '=&' || '新的参数值;"更改参数并将在之后的会话中生效。' when 'FALSE' then case a.is_spfile when 0 then '使用pfile启动,需手动修改pfile文件中对应参数值再重启。' else '使用spfile启动,可用"alter system set ' || name || '=&' || name || ' scope=spfile;"更改参数。更改将在后续的实例中生效(当前数据库需重启)。' end else '?' end "是否可用ALTER SYSTEM修改", isinstance_modifiable "是否不同实例间值可不同" from v$parameter, (select count(1) is_spfile from v$parameter t where t.name = 'spfile') a where name = 'sessions';
如果判断确定SESSIONS值合理,则需分析确定产生大量会话的原因,是否相关程序代码建立了连接未释放?或者其它原因等。【待完善】
备注: 参数SESSIONS:
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 派生公式: (1.1 * PROCESSES) + 5) [11gR1,11gR2] (1.5 * PROCESSES) + 22 |
可修改(不用重启及时生效) | 否 [11gR2,12cR1] 可用ALTER SYSTEM修改 |
取值范围 | 1~2^31 [11gR1,11gR2] 1~2^16(1~65536) |
基础参数 | 是 |
SESSIONS指定可以在系统中创建的最大会话数。因为每次登录都需要一个会话,所以这个参数有效地确定了系统中最大并发用户数。您应该始终将此参数显式设置等于最大并发用户数的估计值+后台进程数+递归会话数(大约占总数的10%)。
Oracle使用此参数的默认值作为其最小值。 将SESSIONS值设置成[1~默认值)不会触发错误,因为Oracle会忽略此值直接使用默认值。
ENQUEUE_RESOURCES和TRANSACTIONS参数的默认值派生自SESSIONS。因此,如果增加SESSIONS的值,则应考虑是否也调整ENQUEUE_RESOURCES和TRANSACTIONS的值。 (请注意,从Oracle Database 10g release 2(10.2)起,ENQUEUE_RESOURCES已被废弃。)
在共享服务器环境中,PROCESSES的值可能相当小。因此,Oracle建议您将SESSIONS的值调整为大约1.1 *总连接数。
ORA-00019: maximum number of session licenses exceeded
All licenses are in use.
措施: 增大LICENSE_MAX_SESSIONS初始化参数的值。【是否需要增加LICENSE_MAX_SESSIONS值还需进行判断,是否是由于此值过小而现实场景需要更大的值?】
Increase the value of the LICENSE MAX SESSIONS initialization parameter.
name = 'sessions'
修改为name = 'license_max_sessions'
即可】 备注: 参数LICENSE_MAX_SESSIONS:
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 0 |
可修改(不用重启及时生效) | 可用ALTER SYSTEM修改 |
取值范围 | 0~许可会话数 |
基础参数 | 否 |
Oracle实时应用集群 | 多个实例可以具有不同的值,但是安装数据库的所有实例的总和应小于或等于该数据库许可的会话总数。 |
LICENSE_MAX_SESSIONS指定允许的并发用户会话的最大数量。达到此限制后,只有具有RESTRICTED SESSION权限的用户才能连接到数据库。无法连接的用户收到表示系统达到最大容量的警告消息。
零值表示不强制执行并发使用(会话)许可。如果将此参数设置为非零数字,则可能还需要设置LICENSE_SESSIONS_WARNING(请参阅“LICENSE_SESSIONS_WARNING”)。
不要同时启用并发使用许可和用户许可,即LICENSE_MAX_SESSIONS与LICENSE_MAX_USERS两参数值至少一个要设置为零。
ORA-00020: maximum number of processes (string) exceeded
All process state objects are in use.
措施: 增加PROCESSES初始化参数的值。【是否需要增加PROCESSES值还需进行判断,是否是由于此值过小而现实场景需要更大的值?】
Increase the value of the PROCESSES initialization parameter.
name = 'sessions'
修改为name = 'processes'
即可】 备注: 参数PROCESSES:
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 40~操作系统依赖数 [10gR2,11gR1] 100 [11gR2,12cR1] 该值是派生的,它通常取决于警报日志中报告的核心数。 |
可修改(不用重启及时生效) | 否 |
取值范围 | 6~操作系统依赖数 |
基础参数 | 是 |
Oracle实时应用集群 | 多个实例可以具有不同的值。 |
PROCESSES指定可以同时连接到Oracle的最大操作系统用户进程数。它的值应允许所有后台进程运行,如锁,作业队列进程和并行执行进程。
该参数派生了SESSIONS和TRANSACTIONS参数的默认值。因此,如果更改PROCESSES的值,则应评估是否要调整这些派生参数的值。
ORA-01722: invalid number
The specified number was invalid.
显式转换:
-- to_number、to_binary_float、to_binary_double转换字符串为数值
select to_number('2017年') from dual; select to_binary_float('8.935M') from dual; select to_binary_double('0.001s') from dual;
隐式转换:
---------涉及到数值类型列的赋值或函数需要函数数值类型结果的转换---------
-- insert/update/merge等语句操作列值
-- 测试表
create table ora_01722_1( a number, b char(24), c varchar2(300) ); -- 插入赋值,无法隐式转换成数值,报错 insert into ora_01722_1(a) values ('111测试字符串'); -- 插入赋值,可以隐式转换成数值,不报错 insert into ora_01722_1(a, b) values ('111', 'bbb'); commit; -- 更新赋值,无法隐式转换成数值,报错 update ora_01722_1 set a = '222测试字符串'; -- decode由第三列的数值1确定了改函数输出结果为数值类型 -- 当匹配到'a'返回1,结果为数值,不报错 select decode('a', 'a', 1, 'b', 2, 'c', 'three', 0) test1 from dual; -- 当匹配到'c'返回'three',结果不为数值且无法转换为数值,报错 select decode('c', 'a', 1, 'b', 2, 'c', 'three', 0) test2 from dual; -- nvl由第一列输入的数值确定了它在此时输出的结果也会为数值 -- 当发现第一个值不为空时,就尝试输出后边的值作为本次nvl函数操作后的数值结果,发现无法转换为数值,报错 select nvl(&请输入数值, '测试') from dual; -- nvl2由第二列的2确定了它在此时输出的结果也会为数值 -- 当不管结果是否为2,它都会讲后边的值进行测试转换……所以无论是否输入null都报错 select nvl2(&无论是否null, 2, '测试') from dual; ---------涉及到与数值类型的比较或其它运算--------- -- 未比较到'三',不报错 select decode(1, 1, 'one', 2, 'two', '三', 'three', 'zero') from dual; -- 比较到'三',报错 select decode(3, 1, 'one', 2, 'two', '三', 'three', 'zero') from dual; -- 与数值进行算术运算,无法隐式转换为数值,报错 select 'a' + 2 from dual; -- 与ora_01722_1的数值类型列a进行比较,将右边转换为数值失败,报错 select * from ora_01722_1 t where t.a = 'a'; -- ora_01722_1列b与数值类型进行比较,将左边转换为数值失败,报错 select * from ora_01722_1 t where t.b = 2;
隐式转换:特别注意时灵时不灵的查询,都是重新类似于上面的情况,但由于之前查询的是部分表数据或部分视图数据等,但是报错是涉及到另一部分甚至是全表全视图的数据,而由于未注意隐式转换导致“脏数据”无法转换成数值类型而报错。其实不是它脏,是你不注意字段类型的区分,请不要依赖于Oracle的隐式转换!
措施: 指定一个有效的数字。
Specify a valid number.
ORA-01747: invalid user.table.column, table.column, or column specification
分析: 一般为在SQL语句或存储过程、函数等中使用到的此字段为oracle的保留关键字,且保留方式标识了此关键字在某些情况下,例如在DML中是否不允许作为标识符的。如下列情况:
-- 查询能做属性但不能作为标识符或某些场景(如DML操作)下不能作为标识符的关键字
select t.* from v$reserved_words t where (t.res_semi = 'Y' or t.reserved = 'Y') and t.res_attr = 'N'; -- 根据上面关键字建表,为测试需要,实际使用时请避免将Oracle保留关键字作为表的字段! create table ora_01747_1 ( "TRIGGER" number, "WHERE" number, "REVOKE" number, "INCREMENT" number, "THEN" number, "FILE" number, "PRIOR" number, "CONNECT" number, "COMMENT" number, "SYSDATE" number, "ONLINE" number, "DECIMAL" number, "SESSION" number, "MODIFY" number, "IN" number, "@" number, "," number, "GRANT" number, "INTO" number, "VALIDATE" number, "." number, "ADD" number, "ORDER" number, "HAVING" number, "TO" number, "NULL" number, "RENAME" number, "LEVEL" number, "USER" number, "ANY" number, /*"ROWID" number, --不可作建表属性*/ "SHARE" number, "MODE" number, "UNION" number, "/" number, "SET" number, "INDEX" number, "MAXEXTENTS" number, "VALUES" number, "|" number, "VIEW" number, "[" number, "WITH" number, "EXCLUSIVE" number, "ALTER" number, "FROM" number, "SELECT" number, "BY" number, "-" number, "MLSLABEL" number, "AND" number, "+" number, "ROWS" number, "CHECK" number, ":" number, "VARCHAR2" number, "IMMEDIATE" number, "CURRENT" number, "AS" number, "*" number, "TABLE" number, "LONG" number, "SYNONYM" number, "ASC" number, "UNIQUE" number, "LIKE" number, "DESC" number, "VARCHAR" number, "INITIAL" number,