powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вычислить запись в базе с ошибочным значением.
13 сообщений из 13, страница 1 из 1
Вычислить запись в базе с ошибочным значением.
    #39957624
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Как всё же грамотно справляться с такой проблемой:

Предположим имеем таблицу Table1 с двумя полями:

code smallint,
data varchar(10)

Предположим делаем запрос

Select code, cast(data as date) mdate from Table1

и на какой-то строке нарываемся на неверное строковое представление даты, типа '32.01.2019' приводящее к падению запроса с
SQLSTATE=22007

Хотелось бы как-то вычислить значение поля code на котором значение data не валидное.
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39957633
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
select data from table1 where data like '%32.%';
select data, count(*) from table1 group by data order by 2;
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39957636
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya,

Нет, я не знаю какая там дата в строке. Так бы было совсем просто.
Просто запрос кастует тысячи записей из стринга в дату и на какой-то спотыкается.
Что бы его поправить в комплексе ПТК нужно знать номер.
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39957648
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дайте угадаю, НВП или КС.

Смотрите group by

Код: sql
1.
select data, count(*) from table1 group by data order by 2;



можно еще так

Код: sql
1.
select data, count(*) koll from table1 group by data having koll < 3 order by koll ;



т.е. "кривые" даты не сгруппируются в большом количестве, а дальше глазами.

Можно еще конечно ч\з регулярное выражение попробовать.
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39957739
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mahaon2000,

Добрый день.

Строки в формате 'DD.MM.YYYY'?
Если да, то:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM
(
SELECT
  DT
, XMLCAST(XMLQUERY('if ($v castable as xs:date) then xs:date($v) else ()' PASSING TRANSLATE('EFGH-CD-AB', DT, 'AB.CD.EFGH') AS "v") AS DATE) DT_SAFE
FROM (VALUES '32.01.2019', '23.01.2019') T (DT)
)
WHERE DT IS NOT NULL AND DT_SAFE IS NULL;


TRANSLATE преобразует 'DD.MM.YYYY' в нужный для XML функции 'YYYY-MM-DD'.
При невозможности преобразования в дату DT_SAFE будет NULL, что и проверяется.
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39957828
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, да, группировка, конечно, по подозрительным полям для выверки напрашивается, а Марк вообще предложил доселе неизвестный мне интересный способ. Будем выверять.

Спасибо

PS Guzya, КС ;)
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39962711
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё же продолжу. Зря я упростил суть вопроса. Представим, что таких таблиц N и запрос с кучей join на каком-то этапе вываливается с SQLSTATE=xxxxx. Какими инструментами или методами можно выявить объект базы приводящий к ошибке? Как максимально локализовать проблему? Трассировку бы какую...
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39962715
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотри по типу ошибки, обычно проблема с датами, которые не даты.
Начинаешь в скрипте отключать части где присутствует работа с возможными проблемными полями пока не найдешь нужную таблицу.

Хотя с другой стороны, в скрипте на КС скорее всего 3-5 таблиц которые сами с собой соединяются, так что по выше описанным
методикам проверить эти таблицы возможно будет быстрее.

А можно написать скриптик проверки этих таблиц и ежедневно вечером запускать, и с утра иметь представление о возможных проблемах.
Так сказать работа на упреждение.
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39962727
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya, увы, но проблемы могут быть не только с датами, а например с id который в одной таблице BIGINT а в другой VARCHAR
и вот когда делаешь join по ним (через cast), то база, в случае если в первой таблице id = NULL выплюнет DECFLOAT SQLSTATE=22018.
Ковырять запрос на 300 строк порой очень проблематично. Должен же быть какой-то инструмент... Ну показывает же dbvizualiser fetch result по которому видно что 800 записей отфетчил нормально а на 801 запрос упал, значит какие-то данные об этой ошибочной 801 хотя бы частично где-то на сервере есть?
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39962794
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mahaon2000
Guzya, увы, но проблемы могут быть не только с датами, а например с id который в одной таблице BIGINT а в другой VARCHAR
и вот когда делаешь join по ним (через cast), то база, в случае если в первой таблице id = NULL выплюнет DECFLOAT SQLSTATE=22018.
Ковырять запрос на 300 строк порой очень проблематично. Должен же быть какой-то инструмент... Ну показывает же dbvizualiser fetch result по которому видно что 800 записей отфетчил нормально а на 801 запрос упал, значит какие-то данные об этой ошибочной 801 хотя бы частично где-то на сервере есть?

Для проблем с математикой смотрите DFT_SQLMATHWARN параметр базы ( https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.admin.config.doc/doc/r0000195.html).
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39962801
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CawaSPb
Для проблем с математикой смотрите DFT_SQLMATHWARN параметр базы


А тут скорее не проблемы с математикой, а проблемы с запросом. Да и менять этот параметр на чужой базе чревато:

"You should only change the setting of dft_sqlmathwarn for a database after carefully evaluating how the new arithmetic exception handling behavior might impact check constraints, triggers, and views. Once changed, subsequent changes require the same careful evaluation."
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39963252
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mahaon2000
Представим, что таких таблиц N и запрос с кучей join на каком-то этапе вываливается с SQLSTATE=xxxxx. Какими инструментами или методами можно выявить объект базы приводящий к ошибке? Как максимально локализовать проблему? Трассировку бы какую...
Проще найти все сравнения разнотипных данных в запросе, использование, скажем, операций преобразования данных в выражениях. К сожалению, в Db2 нет удобных функций типа SAFE_TYPEx (TYPEy):
Код: plaintext
1.
2.
3.
SAFE_DATE(VARCHAR)
SAFE_INT(VARCHAR)
...
Но их можно либо создать самому:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION SAFE_DATE(P_V VARCHAR(10))
RETURNS DATE
DETERMINISTIC
NO EXTERNAL ACTION
CONTAINS SQL
RETURN
XMLCAST(XMLQUERY('if ($v castable as xs:date) then xs:date($v) else ()' PASSING P_V AS "v") AS DATE);


Либо использовать аналогичное выражение напрямую в запросе.
В поля выборки можно добавить выражение показывающее, что преобразование завершилось неудачно - если сама строка NOT NULL, а преобразование вернуло NULL.

Ничего более удобного и позволяющего быстрее найти проблему нет .

Альтернативный вариант - трассировать соединение на сервере с помощью db2trc, но поверьте на слово, что вы навряд ли сможете понять, как полученной информацией пользоваться. Её будет очень много, и там тоже не будет указания в простом виде, что вот, мол, ошибка преобразования данных, которые пришли из такой-то физической записи в такой-то таблице.
...
Рейтинг: 0 / 0
Вычислить запись в базе с ошибочным значением.
    #39963258
mahaon2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Марк.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вычислить запись в базе с ошибочным значением.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]