Неожиданная ошибка SQL возвращает ‹UNDEFINED› в межсистемном кэше.

Проблема

Я работаю над экспортом данных из базы данных Intersystems Cache через драйвер Cache ODBC. Есть конкретная таблица, которая выдает мне сообщение об ошибке. Драйвер ODBC аварийно завершает работу и сообщает об ошибке из системы кэширования. Думаю, мне удалось отследить источник ошибки, но я не знаю, как ее отладить или исправить.

Таблица, которую я пытаюсь извлечь, называется SEDMIHP.

Вот ошибка:

[Cache Error: <<UNDEFINED>%0AmBd16^%sqlcq.PRD.3284 ^SEDMIHP(4,77)>]
[Location: <ServerLoop - Query Fetch>]

Исследования/пробы и ошибки

Мне удалось открыть Cache Management Studio и найти класс, совпадающий с именем таблицы. Я должен упомянуть, что я впервые работаю с 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 я думаю, что этот код манипулирует текстом/строкой, и, возможно, если в данных есть неопределенное или неправильное значение, это приводит к тому, что эти функции вызывают ошибку?

У меня ограниченный доступ к порталу управления кэшем, и я могу найти таблицу в схеме SQL и выполнить к ней запрос. Около 300 строк данных загружаются, прежде чем появляется та же ошибка, что и выше, и она прекращает загрузку строк. Вот почему я думаю, что есть плохие данные.

Я пытался использовать ISNULL() и IFNULL() в операторе SELECT, чтобы попытаться пропустить любые неверные данные, но каждый раз появлялась одна и та же ошибка в одном и том же месте.

Вопросы

  1. Есть ли простое решение со стороны SQL, которое может избежать этой ошибки?
  2. Можно ли что-нибудь сделать с кодом класса в Studio для отладки или получения дополнительной информации об этой ошибке?

Любая помощь приветствуется!

Дополнительная информация

Версия кеша: Cache for OpenVMS/IA64 V8.4 (Itanium) 2012.1.5 (Build 956 + Adhoc 12486) 17-APR-2013 19:49:58.07


person avanschoyck    schedule 30.01.2019    source источник


Ответы (1)


Спасибо Дмитрию Масленникову из сообщества InterSystems, который ответил мне на этот вопрос.

В коде класса все, что мне нужно было сделать, это добавить вызов функции $Get() вокруг глобального ^SEDMIHP. Рабочий код выглядит следующим образом:

<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 можно найти здесь.

person avanschoyck    schedule 30.01.2019