我需要检查是否由某些数据库问题引起异常.我收到一个异常,并检查其原因是否包含"ORA"字符串并返回(类似"ORA-00001").这里的问题是我收到的异常嵌套在其他异常中,所以如果我不知道它是否是一个oracle异常,我必须检查该异常的原因,依此类推.有更清洁的方法吗?有没有办法知道给定异常的第一个原因(深层嵌套异常)?
我当前的代码如下所示:
private String getErrorOracle(Throwable e){
final String ORACLE = "ORA";
if (e.getCause() != null && e.getCause().toString().contains(ORACLE)){
return e.getCause().toString();
} else if(e.getCause() != null){
return getErrorOracle(e.getCause());
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 在哪里可以找到所有预定义的Oracle pl/SQL异常的完整列表?
在这个链接中我找到了这个列表,还有吗?
ACCESS_INTO_NULL ORA-06530
CASE_NOT_FOUND ORA-06592
COLLECTION_IS_NULL ORA-06531
CURSOR_ALREADY_OPEN ORA-06511
DUP_VAL_ON_INDEX ORA-00001
INVALID_CURSOR ORA-01001
INVALID_NUMBER ORA-01722
LOGIN_DENIED ORA-01017
NO_DATA_FOUND ORA-01403
NOT_LOGGED_ON ORA-01012
PROGRAM_ERROR ORA-06501
ROWTYPE_MISMATCH ORA-06504
SELF_IS_NULL ORA-30625
STORAGE_ERROR ORA-06500
SUBSCRIPT_BEYOND_COUNT ORA-06533
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532
SYS_INVALID_ROWID ORA-01410
TIMEOUT_ON_RESOURCE ORA-00051
TOO_MANY_ROWS ORA-01422
VALUE_ERROR ORA-06502
ZERO_DIVIDE ORA-01476
Run Code Online (Sandbox Code Playgroud) 我在表格中有一个约束
CREATE TABLE "USERSAPPLICATIONS" (
"USERID" NUMBER NOT NULL ,
"APPLICATIONNAME" VARCHAR2 (30) NOT NULL ,
CONSTRAINT "PK_USERSAPPLICATIONS" PRIMARY KEY ("USERID","APPLICATIONNAME")
)
/
Run Code Online (Sandbox Code Playgroud)
两周前我修改了表,添加了一些列,删除了约束"PK_USERSAPPLICATIONS"并添加了一个代理键.我可以在Oracle SQL Developer中看到约束PK_USERSAPPLICATIONS不再存在.
无论如何,当我尝试使用相同的userid/applicationName组合添加两个条目时,我收到错误
SQL Error: ORA-00001: unique constraint (ACCOUNTMP1.PK_USERSAPPLICATIONS) violated
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: 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.
*Action: Either remove the unique …
Run Code Online (Sandbox Code Playgroud) 我正在使用Oracle提供程序实体框架(beta),我遇到了一个问题.
我们的表有Id列,在StoreGeneratedPattern中设置为Identity.我认为EF会自动执行"基础工作",例如创建序列,并为我添加到表中的每条记录获取新标识.但是当我运行代码来添加新记录时,例如:
var comment = new Comment
{
ComplaintId = _currentComplaintId,
Content = CommentContent.Text,
CreatedBy = CurrentUser.UserID,
CreatedDate = DateTime.Now
};
context.Comments.AddObject(comment);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
一个异常仍然会抛出,这是
{"ORA-00001:违反了唯一约束(ADMINMGR.CONSTRAINT_COMMENT)"}
(CONSTRAINT_COMMENT是约束要求注释标识必须是唯一的.
我该如何解决这个问题?
非常感谢你!
我们在批处理作业中获得了ORA-00001(违反了唯一约束).但是,发出COMMIT时会发生错误,而不是在插入违规记录时发生.
问题:
任何帮助表示赞赏!
附加信息/问题:
"违规"约束标记为"立即"和"不可延迟".这可以在交易中被覆盖吗?
我正在创建一个简单的表单,使用JDBC通过Java Servlet将输入的数据存储在一个非常简单的Oracle数据库表中.该表使用电子邮件地址作为主键.如果用户使用相同的电子邮件地址多次提交表单,则该execute
函数将失败并抛出SQLException.异常的字符串如下:
java.sql.SQLException: ORA-00001: unique constraint (...removed...) violated
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想通过告诉用户使用相同的电子邮件地址多次提交表单来捕获此异常并处理它.什么是单独处理ORA-00001的正确方法,与可以抛出的任何其他SQLExceptions不同execute
?字符串比较显然可以在这里工作,但这似乎是一个糟糕的解决方案.
背景:http://jeffkemponoracle.com/2011/03/11/handling-unique-constraint-violations-by-hibernate
我们的表是:
BOND_PAYMENTS (BOND_PAYMENT_ID, BOND_NUMBER, PAYMENT_ID)
Run Code Online (Sandbox Code Playgroud)
BOND_PAYMENT_ID上有主键约束,(BOND_NUMBER,PAYMENT_ID)上有唯一约束.
该应用程序使用Hibernate,并允许用户查看链接到特定Bond的所有付款; 它允许他们创建新链接,并删除现有链接.一旦他们在页面上做了所有他们想要的更改,他们就会点击"保存",Hibernate会在数据库上运行所需的SQL.显然,Hibernate可以找出需要删除的记录,需要插入哪些记录,并保持其余部分不变.不幸的是,它首先执行INSERT,然后执行DELETE.
如果用户删除了付款的链接,然后改变主意并重新插入指向同一付款的链接,Hibernate很乐意尝试插入然后将其删除.由于这些插入/删除作为单独的SQL语句运行,因此Oracle会在第一个插入时立即验证约束并发出违反ORA-00001唯一约束的情况.
我们只知道两种选择:
选项2不太合适,因为约束提供了极好的保护,可以防止可能允许保存不一致数据的令人讨厌的应用程序错误.我们选择了1.
ALTER TABLE bond_payments ADD
CONSTRAINT bond_payment_uk UNIQUE (bond_number, payment_id)
DEFERRABLE INITIALLY DEFERRED;
Run Code Online (Sandbox Code Playgroud)
缺点是为警告此约束而创建的索引现在是一个非唯一索引,因此查询的效率可能稍低.我们已经确定这对于这个特殊情况并没有那么大的损害.另一个缺点(由Gary建议)可能会遇到特定的Oracle错误 - 虽然我相信由于应用程序的工作方式,我们会免疫(至少大部分).
我们还应该考虑其他选择吗?
我有以下代码:
begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
dbms_random.string('U',5),
trunc(dbms_random.value(0000,9999)),
prod_id from dba_xy.product
prod_name from dba_xy.product;
end loop;
Run Code Online (Sandbox Code Playgroud)
结束;
当我运行它时,oracle给我以下错误消息:
prod_name from dba_xy.product;
*
Run Code Online (Sandbox Code Playgroud)
第8行的错误:ORA-06550:第8行,第29列:PL/SQL:ORA-00933:SQL命令未正确结束ORA-06550:第3行,第2列:PL/SQL:忽略SQL语句
我要做的是将现有的prod_id和prod_name与插入到发货表中的新数据相关联.我已将prod_name设置为product表中的唯一键,将prod_id设置为主键,并在despatch表中将两者都设置为外键约束.我需要将prod_name包含在despatch表中,以允许表的读者更多地了解需要找到的prod_name等,而不是仅仅给出对它们毫无意义的prod_id.但也许我认为我在发货表中不需要prod_id.请帮忙.
从发货表中删除prod_id列后,我改变了我的代码:
begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
dbms_random.string('U',5),
trunc(dbms_random.value(0000,9999)),
prod_name from dba_xy.product;
end loop;
Run Code Online (Sandbox Code Playgroud)
结束; /
并且出现以下关于唯一约束的错误消息:第1行的begin*ERROR:ORA-00001:违反ORA-06512的唯一约束(DBA_XY.PROD_NAME_UC):第3行
我正在继承我继承的Rails站点上进行维护工作; 它由Oracle数据库驱动,我可以访问该站点的开发和生产安装(每个都有自己的Oracle DB).我在尝试在生产站点上插入数据时遇到了Oracle错误,但是在开发站点上没有:
ActiveRecord::StatementInvalid (OCIError: ORA-00001: unique constraint (DATABASE_NAME.PK_REGISTRATION_OWNERSHIP) violated: INSERT INTO registration_ownerships (updated_at, company_ownership_id, created_by, updated_by, registration_id, created_at) VALUES ('2006-05-04 16:30:47', 3, NULL, NULL, 2920, '2006-05-04 16:30:47')):
/usr/local/lib/ruby/gems/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:221:in `execute'
app/controllers/vendors_controller.rb:94:in `create'
Run Code Online (Sandbox Code Playgroud)
据我所知(我使用Navicat作为Oracle客户端),开发站点的数据库架构与实际站点的数据库架构相同.我不是Oracle专家; 任何人都可以解释为什么我会在一次安装而不是另一次安装中得到错误?
顺便提一下,dev和production registration_ownerships表都填充了大量数据,包括country_ownership_id的重复条目(由索引PK_REGISTRATION_OWNERSHIP驱动).如果您需要更多信息进行故障排除,请与我们联系.对不起,我还没有给出更多,但我不确定哪些细节会有所帮助.
更新:我尝试在生产服务器上删除约束但它没有效果; 我也不想放弃索引,因为我不确定后果可能是什么,我不想让生产比现在更不稳定.
奇怪的是,我尝试手动执行抛出错误的SQL,并且Oracle接受了insert语句(尽管我必须使用字符串文字将日期包含在to_date()调用中以绕过"ORA-01861:文字不匹配"格式字符串"错误".这可能会发生什么?
我从像这样的批量插入操作中捕获错误:
begin
--bulk insert
forall i in v_data.first .. v_data.last save exceptions
insert into my_filter_table values v_data (i);
commit;
exception
-- catch and print the saved-up DML errors.
when X_DML_ERRORS then
declare
v_iteration number;
begin
dbms_output.put_line('');
dbms_output.put_line('DML Errors:');
for i in 1 .. SQL%BULK_EXCEPTIONS.count loop
v_iteration := SQL%BULK_EXCEPTIONS(i).error_index;
dbms_output.put_line('Iteration: '||v_iteration||' Message: '||
SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
end loop;
end;
end;
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
Iteration: 3 Message: ORA-01400: cannot insert NULL into () Iteration: 4 Message: ORA-02290: check constraint (.) violated Iteration: 8 Message: ORA-00001: unique …