我们的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有一个更清晰/更健壮的方式,如果一个约束失败,找出失败约束的实际名称,而不诉诸硬编码字符串操作。
有什么想法吗?
答案 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消息。
我同意你的意见;如果有更好的方法来获取你违反的约束名称会很棒,但字符串匹配似乎是预期的方式。