Oracle строка слишком длинная для внутреннего буфера при использовании INTERVAL в качестве строки - PullRequest
0 голосов
/ 14 апреля 2020

Сценарий создания таблицы:

CREATE TABLE "TEST"("INTERVAL_COL" INTERVAL DAY (0) TO SECOND (6));
Insert into TEST (INTERVAL_COL) values ('+00 11:00:24.920000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:26.890000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:28.460000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:30.140000');
Insert into TEST (INTERVAL_COL) values ('+00 11:00:31.790000');
commit;

В SQL Developer и sqlPlus, запуск SELECT * FROM TEST работает нормально, как и SELECT INTERVAL_COL FROM TEST.

Но, любое из следующего дай мне ошибку:

SELECT INTERVAL_COL || '.' FROM TEST
SELECT TO_CHAR(INTERVAL_COL, 'HH24:MM.SS') FROM TEST

Ошибка:

ORA-01877: слишком длинная строка для внутреннего буфера

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Если вы хотите преобразовать эти day to second данные в HH24:MI:SS, тогда вы можете использовать:

TO_CHAR(CAST((TRUNC(SYSTIMESTAMP)+INTERVAL_COL) AS DATE), 'HH24:MI.SS')

Также, как прокомментировал Алекс,

TO_CHAR(TRUNC(SYSDATE)+INTERVAL_COL, 'HH24:MI.SS')

тоже будет работать .

0 голосов
/ 14 апреля 2020

Несмотря на документированное TO_CHAR, похоже, не работает со значениями INTERVAL. Выходной формат INTERVAL всегда фиксированный, т.е. он не зависит от текущих настроек NLS сеанса пользователя, поэтому вы можете использовать RegExp.

Попробуйте это:

REGEXP_REPLACE(REGEXP_SUBSTR(INTERVAL_COL, '\d{2}:\d{2}:\d{2}'), ':(\d{2})$', '.\1') 

Обратите внимание, если интервалы могут превышать 24 часа, тогда результат будет неправильным (то же самое относится к решениям типа TO_CHAR(CAST((TRUNC(SYSTIMESTAMP)+INTERVAL_COL) AS DATE), 'HH24:MI.SS'))

...