Неожиданная ошибка SQL возвращает <UNDEFINED>в Intersystems Cache - PullRequest
0 голосов
/ 30 января 2019

Проблема

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

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

Вот ошибка:

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

Research / Trial & Error

Мне удалось открыть 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. Могу ли я что-нибудь сделать с кодом класса вСтудия для отладки или получения дополнительной информации об этой ошибке?

Любая и вся помощь очень ценится!

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

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

1 Ответ

0 голосов
/ 31 января 2019

Кредит переходит к Дмитрию Масленникову на InterSystems Community, который ответил на этот вопрос для меня.

В коде класса все, что мне нужно было сделать, это добавить вызов функции $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 можно найти здесь .

...