如何从OCIErrorGet获取约束错误?

时间:2011-12-03 03:15:12

标签: c++ c oracle constraints oci

我们的C ++程序正在使用Oracle和OCI来完成数据库工作。有时,用户将触发约束违规,我们会检测到该约束,然后显示来自OCIErrorGet的错误消息。 OCIErrorGet返回如下字符串:

ORA-02292: integrity constraint (MYSCHEMA.CC_MYCONSTRAINT) violated - child record found
ORA-06512: at line 5

我正在寻找从Oracle错误中提取“MYSCHEMA.CC_MYCONSTRAINT”的最简洁方法。知道了约束的名称,我可以显示更好的错误消息(如果有权访问约束名称,我们的代码可以查找非常有意义的错误消息)。

我可以使用正则表达式或其他东西,并假设Oracle消息永远不会改变,但这对我来说似乎有点脆弱。或者我可以查找特定的ORA代码,然后抓住括号之间的任何文本。但我希望OCI有一个更清晰/更健壮的方式,如果一个约束失败,找出失败约束的实际名称,而不诉诸硬编码字符串操作。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

根据Oracle Docs,字符串搜索正是您需要做的:

  

识别消息中的可变文本

     

为了帮助您查找和修复错误,Oracle嵌入了对象名称,数字,   和某些消息中的字符串。这些嵌入变量是   由字符串,数字或字符表示,视情况而定。对于   例如:

ORA-00020: maximum number of processes (number) exceeded
     

上述消息实际上可能如下所示:

ORA-00020: maximum number of processes (50) exceeded

Oracle在他们的文档中提出了一个重要的观点,即在“消息准确性”一节中,字符串将保持最新。这是一个非常强烈的建议,他们打算你进行字符串搜索。

此外,根据this website,Oracle Error结构也强烈暗示他们打算进行字符串搜索,因为数据结构缺少任何其他内容供您使用:

array(4) {
   ["code"]=>int(942)
   ["message"]=>string(40) "ORA-00942: table or view does not  exist"
   ["offset"]=>int(14)
   ["sqltext"]=>string(32) "select * from non_existing_table" 
}
  

此输出显示以下信息:

     
      
  • 变量$ erris是一个包含四个元素的数组。

  •   
  • 第一个元素可以通过键'code'访问,其值为942。

  •   
  • 第二个值可通过键'message'访问,值为字符串“ORA-00942:表或视图不存在”。

  •   
  • 第三个值可通过键'offset'访问,其值为数字14.这是第一个字符前面的字符   不存在的表格。

  •   
  • 第四个成员是导致错误的有问题的SQL消息。

  •   

我同意你的意见;如果有更好的方法来获取你违反的约束名称会很棒,但字符串匹配似乎是预期的方式。