系统间缓存中的意外 SQL 错误 returns <UNDEFINED>
Unexpected SQL error returns <UNDEFINED> in Intersystems Cache
问题
我正在通过缓存 ODBC 驱动程序从系统间缓存数据库导出数据。有一个特定的 table 给我一条错误消息。 ODBC 驱动程序崩溃并报告来自缓存系统的错误。我想我能够追踪到错误的来源,但我不知道如何调试或修复错误。
我要提取的 table 称为 SEDMIHP
。
这是错误:
[Cache Error: <<UNDEFINED>%0AmBd16^%sqlcq.PRD.3284 ^SEDMIHP(4,77)>]
[Location: <ServerLoop - Query Fetch>]
Research/Trial & 错误
我能够打开 Cache Management Studio 并找到与 table 名称匹配的 class。我应该提一下,这是我第一次使用 Intersystems Cache,所以如果我在这里听起来很愚蠢或缺乏经验,我深表歉意。
在 SQLMap
中,我找到了这段代码:
<Data name="DESCRIP_2">
<RetrievalCode> S {DESCRIP_2}=$P($G(^PHPROP({L1},"DESC_CODES")),"\",2) S {DESCRIP_2}=$S($L({DESCRIP_2}):^SEDMIHP($P({DESCRIP_2},","),$P({DESCRIP_2},",",2)),1:{DESCRIP_2})
S {DESCRIP_2}=$E({DESCRIP_2},1,80)
</RetrievalCode>
</Data>
我认为此处的代码引起了问题。由于我对 ObjectScript 的理解非常有限,我认为这段代码正在操纵 text/string,如果数据中存在未定义或错误的值,可能会导致这些函数抛出错误?
我对缓存管理门户的访问权限有限,我能够在 SQL 架构中找到 table 并在其上找到 运行 查询。在出现与上述相同的错误之前加载了大约 300 行数据,并且它停止加载更多行。这就是为什么我认为存在错误数据。
我尝试在 SELECT 语句中使用 ISNULL()
和 IFNULL()
来尝试跳过任何错误数据,但每次都在同一个地方出现相同的错误。
问题
- SQL 方面是否有可以避免此错误的简单解决方案?
- 我可以使用 Studio 中的 class 代码来调试或获取有关此错误的更多信息吗?
非常感谢任何帮助!
附加信息
缓存版本:Cache for OpenVMS/IA64 V8.4 (Itanium) 2012.1.5 (Build 956 + Adhoc 12486) 17-APR-2013 19:49:58.07
感谢 InterSystems 社区的 Dmitry Maslennikov,他为我回答了这个问题。
在 Class 代码中,我所要做的就是在全局 ^SEDMIHP
周围添加一个 $Get()
函数调用。工作代码如下:
<Data name="DESCRIP_2">
<RetrievalCode> S {DESCRIP_2}=$P($G(^PHPROP({L1},"DESC_CODES")),"\",2) S {DESCRIP_2}=$S($L({DESCRIP_2}):$Get(^SEDMIHP($P({DESCRIP_2},","),$P({DESCRIP_2},",",2))),1:{DESCRIP_2})
S {DESCRIP_2}=$E({DESCRIP_2},1,80)
</RetrievalCode>
</Data>
InterSystems 社区的 link 答案可以在 here 中找到。
问题
我正在通过缓存 ODBC 驱动程序从系统间缓存数据库导出数据。有一个特定的 table 给我一条错误消息。 ODBC 驱动程序崩溃并报告来自缓存系统的错误。我想我能够追踪到错误的来源,但我不知道如何调试或修复错误。
我要提取的 table 称为 SEDMIHP
。
这是错误:
[Cache Error: <<UNDEFINED>%0AmBd16^%sqlcq.PRD.3284 ^SEDMIHP(4,77)>]
[Location: <ServerLoop - Query Fetch>]
Research/Trial & 错误
我能够打开 Cache Management Studio 并找到与 table 名称匹配的 class。我应该提一下,这是我第一次使用 Intersystems Cache,所以如果我在这里听起来很愚蠢或缺乏经验,我深表歉意。
在 SQLMap
中,我找到了这段代码:
<Data name="DESCRIP_2">
<RetrievalCode> S {DESCRIP_2}=$P($G(^PHPROP({L1},"DESC_CODES")),"\",2) S {DESCRIP_2}=$S($L({DESCRIP_2}):^SEDMIHP($P({DESCRIP_2},","),$P({DESCRIP_2},",",2)),1:{DESCRIP_2})
S {DESCRIP_2}=$E({DESCRIP_2},1,80)
</RetrievalCode>
</Data>
我认为此处的代码引起了问题。由于我对 ObjectScript 的理解非常有限,我认为这段代码正在操纵 text/string,如果数据中存在未定义或错误的值,可能会导致这些函数抛出错误?
我对缓存管理门户的访问权限有限,我能够在 SQL 架构中找到 table 并在其上找到 运行 查询。在出现与上述相同的错误之前加载了大约 300 行数据,并且它停止加载更多行。这就是为什么我认为存在错误数据。
我尝试在 SELECT 语句中使用 ISNULL()
和 IFNULL()
来尝试跳过任何错误数据,但每次都在同一个地方出现相同的错误。
问题
- SQL 方面是否有可以避免此错误的简单解决方案?
- 我可以使用 Studio 中的 class 代码来调试或获取有关此错误的更多信息吗?
非常感谢任何帮助!
附加信息
缓存版本:Cache for OpenVMS/IA64 V8.4 (Itanium) 2012.1.5 (Build 956 + Adhoc 12486) 17-APR-2013 19:49:58.07
感谢 InterSystems 社区的 Dmitry Maslennikov,他为我回答了这个问题。
在 Class 代码中,我所要做的就是在全局 ^SEDMIHP
周围添加一个 $Get()
函数调用。工作代码如下:
<Data name="DESCRIP_2">
<RetrievalCode> S {DESCRIP_2}=$P($G(^PHPROP({L1},"DESC_CODES")),"\",2) S {DESCRIP_2}=$S($L({DESCRIP_2}):$Get(^SEDMIHP($P({DESCRIP_2},","),$P({DESCRIP_2},",",2))),1:{DESCRIP_2})
S {DESCRIP_2}=$E({DESCRIP_2},1,80)
</RetrievalCode>
</Data>
InterSystems 社区的 link 答案可以在 here 中找到。