Колонка Oracle CLOB и LAG - PullRequest
       1

Колонка Oracle CLOB и LAG

0 голосов
/ 16 ноября 2018

Я сталкиваюсь с проблемой при попытке использовать функцию LAG в столбце CLOB.

Итак, давайте предположим, что у нас есть таблица

create table test (
    id number primary key, 
    not_clob varchar2(255),
    this_is_clob clob
);

insert into test values (1, 'test1', to_clob('clob1'));
insert into test values (2, 'test2', to_clob('clob2'));

DECLARE
x CLOB := 'C';
BEGIN

 FOR i in 1..32767
 LOOP
  x := x||'C';
 END LOOP;

 INSERT INTO test(id,not_clob,this_is_clob) values(3,'test3',x);

END;
/

commit;

Теперь давайте сделаем выборку, используя не закрывающиеся столбцы

select id, lag(not_clob) over (order by id) from test;

Работает нормально, как и ожидалось, но когда я пытаюсь сделать то же самое с столбцом clob

select id, lag(this_is_clob) over (order by id) from test;

Я получаю

ORA-00932: inconsistent datatypes: expected - got CLOB
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 1 Column: 16

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

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

В документации говорится, что аргументом для любой аналитической функции может быть любой тип данных, но кажется, что неограниченный CLOB не поддерживается.

Однако существует обходной путь:

select id, lag(dbms_lob.substr(this_is_clob, 4000, 1)) over (order by id) 
from test;

Это невесь CLOB, но 4k должен быть достаточно хорошим во многих случаях.

Мне все еще интересно, как правильно решить проблему

Возможно ли обновление до 12c?Проблема не имеет ничего общего с CLOB как таковым, это тот факт, что Oracle имеет жесткий предел для строк в SQL 4000 символов.В 12c у нас есть возможность использовать расширенные типы данных (при условии, что мы можем убедить наших администраторов баз данных включить их!). Узнайте больше.

0 голосов
/ 16 ноября 2018

Некоторые функции могут не работать должным образом в SQL при использовании CLOBs (например, DISTINCT, ORDER BY GROUP BY и т. Д. Похоже, LAG также является одной из них, но я нигде не смог найти в документах.

Если ваши значения в столбцах CLOB всегда меньше 4000 символов, вы можете использовать TO_CHAR

select id, lag( TO_CHAR(this_is_clob)) over (order by id) from test;

OR

преобразовать его в эквивалент SELF JOIN (может быть не так эффективно, как LAG)

SELECT a.id,
       b.this_is_clob AS lagging
FROM test a
LEFT JOIN test b ON b.id < a.id;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...