如何从OCIErrorGet获取约束错误

How to get constraint errors from OCIErrorGet?

本文关键字:约束 错误 获取 OCIErrorGet      更新时间:2023-10-16

我们的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有一种更干净/更稳健的方法,如果约束失败,可以在不使用硬编码字符串操作的情况下计算出失败约束的实际名称。

有什么想法吗?

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

识别消息中的可变文本

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

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

前面的消息实际上可能显示如下:

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

Oracle在他们的文档中强调,字符串将在"消息准确性"部分保持最新。这是一个非常强烈的建议,他们打算让你进行字符串搜索。

此外,根据该网站的说法,Oracle错误结构也非常强烈地暗示他们打算让你进行字符串搜索,因为数据结构缺乏其他任何信息:

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" 
}

此输出显示以下信息:

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

  • 键"code"可访问第一个元素,其值为数字942。

  • 第二个值可由键"message"访问,值为字符串"ORA-00942:表或视图不存在"。

  • 第三个值可由键"offset"访问,其值为数字14。这是
    的名称之前的字符不存在的表。

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

我同意你的看法;如果有更好的方法来获得您违反的约束名称,那就太好了,但字符串匹配似乎是预期的方法。