如何从OCIErrorGet获取约束错误
How to get constraint errors from OCIErrorGet?
我们的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消息。
我同意你的看法;如果有更好的方法来获得您违反的约束名称,那就太好了,但字符串匹配似乎是预期的方法。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在模板 SFINAE 约束中使用间接寻址级别会导致硬错误
- 错误:使用gcc 32位时,"asm"操作数具有不可能的约束
- 如何从OCIErrorGet获取约束错误
- 在 GNU 的C++代码中使用 C 标头。包括内联装配的错误:'asm'中不可能的约束
- oracle occi连接池报告ORA-00001:违反了唯一约束(%s.%s)错误
- 收到错误:将我的 c++ 代码从 Linux 移植到 android 时'asm'中的操作数约束不一致