Дана таблица базы данных TABLE1 со столбцом COLUMN1 типа VARCHAR(1020). Мне нужно переформатировать некоторые данные из формата переменной длины в новый формат фиксированной длины (хэши удаляются, числа дополняются нулями до длины 10):
например: из "123#456#789" в "000000012300000004560000000789".
Выполнение данного sql-оператора приводит к следующему сообщению об ошибке, которое не очень полезно и указывает только на разрыв соединения:
Произошла ошибка при выполнении SQL-запроса
Ursache: SQL-Fehler [08001]: [jcc][t4][2030][11211][4.22.29] Bei Operationen auf dem der Verbindung zugrunde liegendem Socket, im Socketeingabedatenstrom oder Socketausgabedatenstrom ist ein Kommunikationsfehler aufgetreten.
Fehlerposition: Reply.fill() - недостаточно данных (-1). Nachricht: Unzureicende Daten. КОД ОШИБКИ=-4499, SQLSTATE=08001
Я работаю над базой данных DB2-LUW 11.1 v10.5.0.5, где регулярные выражения не поддерживаются, за исключением запросов xml.
Когда я заменяю второй оператор return на «return xs: string ($ COLUMN1)», оператор выполняется нормально. Так что это не похоже на синтаксическую ошибку.
Я нашел некоторую информацию о том, что порядок операторов let не фиксирован. Итак, я попытался удалить логику if/then/else, и это всегда приводило к одинаковым результатам, так что это тоже не проблема.
UPDATE TABLE1
SET COLUMN1 = xmlcast(xmlquery(
'
if (fn:matches( $COLUMN1,"(\d{0,10})#(\d{1,10})#(\d{1,10})"))
then
xs:string($COLUMN1)
else
let $part1A := fn:replace($COLUMN1, "(\d{0,10})#(\d{1,10})#(\d{1,10})", "$1", "i")
let $part1B := fn:string-join(("0000000000", $part1A), "")
let $part1C := fn:substring($part1B, fn:string-length($part1B) - 9)
let $part2A := fn:replace($COLUMN1, "(\d{0,10})#(\d{1,10})#(\d{1,10})", "$2", "i")
let $part2B := fn:string-join(("0000000000", $part2A), "")
let $part2C := fn:substring($part2B, fn:string-length($part2B) - 9)
let $part3A := fn:replace($COLUMN1, "(\d{0,10})#(\d{1,10})#(\d{1,10})", "$3", "i")
let $part3B := fn:string-join(("0000000000", $part3A), "")
let $part3C := fn:substring($part3B, fn:string-length($part3B) - 9)
let $result := fn:string-join(($part1C, $part2C, $part3C), "")
return xs:string($result)
'
passing COLUMN1 AS "COLUMN1"
) AS VARCHAR(1020))
WHERE COLUMN1 IS NOT NULL AND LENGTH(COLUMN1 ) > 0;
Ожидается, что обновление sql будет выполнено успешно, а не ошибка, которая приведет к разрыву соединения с базой данных.