ORA-00000: normal, successful completion
Normal exit.
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;
/
措施: 无。【如果是人为需要获取该异常,则不用做任何操作;如果是逻辑有误,那么需要调整不去此异常或者在遇到此异常时将其屏蔽去掉。】
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 参数名=参数值 [comment='注释'] [deferred] [scope=memory|spfile|both] [sid='sid|*'];
/*
comment='注释',修改时可添加注释,会在V$PARAMETER视图的update_comment字段看到内容,和参数值生效情况保存一致;
deferred,指定参数修改是否只对以后的会话生效(对当前建立的会话无效,包括执行此修改的会话),部分参数必须加此参数;
scope=both,表示修改会立即生效且会修改spfile文件以确保数据库在重启后也会生效如果(以spfile启动此项为缺省值);
scope=memory,表示修改会立即生效但不会修改spfile文件,因此重启后失效(以pfile启动此项为缺省值,且只可设置这个值);
scope=spfile,表示只修改spfile文件,在重启实例后才生效(以spfile启动且为静态参数则必须设置此项值);
sid='sid|*',默认是sid=*,可改为在集群环境中的一个指定的实例值。
*/
-- 查看"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 || '=&' ||
'新的参数值 deferred;"更改参数并将在之后的会话中生效。'
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' and t.value is not null) a
where name = 'sessions';
如果判断确定SESSIONS值合理,则需分析确定产生大量会话的原因,是否相关程序代码建立了连接未释放?或者其它原因等。【待完善】
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 派生公式: 【?~11gR1】=”(1.1 * PROCESSES) + 5)”; 【11gR2~12cR2】=”(1.5 * PROCESSES) + 22” |
可修改(不用重启及时生效) | 【?~11gR2】=”否”; 【12cR1~12cR2】=”可用ALTER SYSTEM修改” |
取值范围 | 【?~11gR1】=”1~2^31”; 【11gR2~12cR2】=”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'
即可】属性 | 描述 |
---|---|
参数类型 | 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'
即可】属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 【?~10gR2】=”40~操作系统依赖数”; 【11gR1~11gR2】=”100”; 【12cR1~12cR2】=”该值是派生的,它通常取决于警报日志中报告的核心数。” |
可修改(不用重启及时生效) | 否 |
取值范围 | 6~操作系统依赖数 |
基础参数 | 是 |
Oracle实时应用集群 | 多个实例可以具有不同的值。 |
PROCESSES指定可以同时连接到Oracle的最大操作系统用户进程数。它的值应允许所有后台进程运行,如锁,作业队列进程和并行执行进程。
该参数派生了SESSIONS和TRANSACTIONS参数的默认值。因此,如果更改PROCESSES的值,则应评估是否要调整这些派生参数的值。
ORA-00021: session attached to some other process; cannot switch session
The user session is currently used by others.
措施: 不要切换到附加到其他进程的会话。
Do not switch to a session attached to some other process.
ORA-00022: invalid session ID; access denied
Either the session specified does not exist or the caller does not have the privilege to access it.
措施: 指定您具有访问权限的有效会话ID,即您拥有该会话ID或具有CHANGE_USER权限。
Specify a valid session ID that you have privilege to access, that is either you own it or you have the CHANGE_USER privilege.
ORA-00023: session references process private memory; cannot detach session
An attempt was made to detach the current session when it contains references to process private memory.
措施: 如果会话具有打开的网络连接,非常大的上下文区域或操作系统权限,该会话就可能包含对进程内存(PGA)的引用。为了允许分离,可能需要关闭会话的数据库链接和/或游标。始终禁止使用操作系统权限脱离会话。
A session may contain references to process memory (PGA) if it has an open network connection, a very large context area, or operating system privileges. To allow the detach, it may be necessary to close the session’s database links and/or cursors. Detaching a session with operating system privileges is always disallowed.
ORA-00024: logins from more than one process not allowed in single-process mode
Trying to login more than once from different processes for ORACLE started in single-process mode.
措施: 请从其它进程注销。
Logoff from the other process.
ORA-00439: feature not enabled: string
The specified feature is not enabled.
措施: 不要尝试使用此功能。
Do not attempt to use this feature.