TIMESTAMP_FORMAT не работает с OFFSET в DB2 - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь сделать нумерацию страниц в DB2.Я не хотел бы делать это с подзапросом, но OFFSET не работает с TIMESTAMP_FORMAT.

Использование функции TIMESTAMP_FORMAT в QSYS2 недопустимо.Ошибка отображения данных на элементе

Я нашел этот вопрос, но, похоже, здесь проблема в содержимом столбца, и это не мой случай, так как значения в порядке, а TIMESTAMP_FORMAT работает без OFFSET.Я не искал другого способа не использовать TIMESTAMP_FORMAT, поскольку мне нужно создать нумерацию страниц по запросам, написанным не мной, а клиентом.

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

SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) 
FROM tableName
OFFSET 10 ROWS

Я получаю

"[SQL0583] Использование функции TIMESTAMP_FORMAT в QSYS2 недопустимо."

Я не уверен, как OFFSET может относиться к TIMESTAMP_FORMAT, но когдаЯ заменяю select на select *, он отлично работает

Интересно, почему существует конфликт между OFFSET и TIMESTAMP_FORMAT, и есть ли способ обойти это без подзапроса.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

С Список сообщений SQL :

SQL0583
Функция & 1 в & 2 не может быть вызвана там, где указано, поскольку определено как недетерминированное или содержитвнешнее действие .
Функции, которые не являются детерминированными, нельзя указывать ни в предложении GROUP BY, ни в предложении JOIN, ни в предложении по умолчанию для глобальной переменной.
Функции, которые не являются детерминированнымиили содержать внешнее действие нельзя указывать в предложении PARTITION BY или предложении ORDER BY для функции OLAP, а нельзя указывать в списке выбора запроса, содержащего предложение OFFSET .
Функция RAISE_ERROR не может быть указана в предложении GROUP BY или HAVING.

Я не знаю, как проверить эти свойства для функции QSYS2.TIMESTAMP_FORMAT (ее определение в * 1020 отсутствует)* таблица), но это выглядит как неправильное определение этой функции - нет причин создавать ее как not deterministic или external action.
Вы можете «обмануть»DB2 как это:

CREATE FUNCTION MYSCHEMA.TIMESTAMP_FORMAT(str VARCHAR(4000), fmt VARCHAR(128))
RETURNS TIMESTAMP
DETERMINISTIC
CONTAINS SQL
NO EXTERNAL ACTION
RETURN QSYS2.TIMESTAMP_FORMAT(str, fmt);

SELECT 
DATE(MYSCHEMA.TIMESTAMP_FORMAT(CHAR(tablename.date), 'YYMMDD')) 
--DATE(QSYS2.TIMESTAMP_FORMAT(CHAR(tablename.date), 'YYMMDD')) 
FROM table(values '190412') tableName(date)
OFFSET 10 ROWS;

И используйте эту функцию вместо.По крайней мере, он работает на моем 7.3.
Это безобидный обман, и вы можете попросить службу поддержки IBM прояснить такую ​​"особенность" QSYS2.TIMESTAMP_FORMAT ...

0 голосов
/ 12 апреля 2019

Я подозреваю, что ваша проблема это неверные данные ...

Значением по умолчанию для интерактивных инструментов IBM, STRSQL и ACS Run SQL Scripts является OPTIMIZE(*FIRSTIO), означающее получение первых нескольких строк назад как можно быстрее ...

С предложением OFFSET 10 вы, вероятно, изначально обращаетесь к строкам, которых раньше не было.

Попробуйте следующее

create table mytest as (
  SELECT DATE(TIMESTAMP_FORMAT(CHAR("tablename"."date"),'YYMMDD')) as mydate
FROM tableName
) with data

Если это не ошибка, то да, вы нашли ошибку, откройте PMR.

В противном случае вы можете увидеть, как далеко продвинулась БД, посмотрев на строки в новой таблице и отследив запись с неверными данными.

...