4

我们的 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 有一种更简洁/更健壮的方式,如果约束失败,可以在不诉诸硬编码字符串操作的情况下找出失败约束的实际名称。

有任何想法吗?

4

1 回答 1

3

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

识别消息中的可变文本

为了帮助您查找和修复错误,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" 
}

此输出显示以下信息:

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

  • 第一个元素可通过键“code”访问,其值为数字 942。

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

  • 第三个值可以通过键 'offset' 访问,它的值是数字 14。这是
    不存在的表名称之前的字符。

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

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

于 2011-12-05T23:42:43.540 回答