powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLOB в UNION - ошибка несовместимый тип данных
8 сообщений из 8, страница 1 из 1
CLOB в UNION - ошибка несовместимый тип данных
    #39698370
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,
что-то затруднился. Есть UNION, объединяющий записи, которые содержат поле CLOB. Поскольку UNION удаляет из выборки дубли, то валится ошибка ORA-00932 - несовместимый тип данных. (Для удаления дублей происходит сравнение полей, а CLOBы сравнивать нельзя). UNION ALL работает, но он здесь недопустим, мне нужна выборка без дублей. Как здесь лучше выкрутиться?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
      select f_id,  --не уникальный
               mess_id,
               mess_num,
               case_num,
               pub_date,
               text,  --CLOB
               dec_date,
               dec_type_id ,
               name,
               c_name,
               modify_date,
               am_i     
        from table1
        join ...
        where ...
UNION
      select f_id, --не уникальный
               mess_id,
               mess_num,
               case_num,
               pub_date,
               text,  --CLOB
               dec_date,
               dec_type_id ,
               name,
               c_name,
               modify_date,
               am_i     
        from table1
        join ...
        where ...
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698375
rimall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+ столбец md5(text)
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698448
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rimall, но если добавить md5(text) и оставить text это проблему не решит. Удалить text нельзя, мне нужно вернуть его содержимое. Или я не так понял?
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698497
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> select to_clob(job) job from emp where deptno = 10
  2  union
  3  select to_clob(job) job from emp where deptno = 20
  4  /
select to_clob(job) job from emp where deptno = 10
       *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got CLOB


SQL> with t as (
  2              select rowid rid,to_clob(job) job from emp where deptno = 10
  3             union all
  4              select rowid rid,to_clob(job) job from emp where deptno = 20
  5            )
  6  select  job
  7    from  t t1
  8    where not exists (
  9                      select  1
 10                        from  t t2
 11                        where t2.rid < t1.rid
 12                          and dbms_lob.compare(t1.job,t2.job) = 0
 13                     )
 14  /

JOB
--------------------------------------------------------------------------------
PRESIDENT
CLERK
MANAGER
ANALYST

SQL> 



SY.
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698505
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis,

Или создаем тип с методом ORDER (или MAP):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create or replace
  type clob_obj
    as object( 
              c clob,
              order member function match(
                                          p_clob_obj clob_obj
                                         )
                return integer
             )
/
create or replace
   type body clob_obj
     as
       order member function match(
                                   p_clob_obj clob_obj
                                  )
          return integer
          is
          begin
              return case
                       when self.c = p_clob_obj.c or nvl(self.c,p_clob_obj.c) is null then 0
                       when self.c < p_clob_obj.c or self.c is null then -1
                       when self.c > p_clob_obj.c or p_clob_obj.c is null then 1
                     end;
        end;
end;
/



Теперь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> with t as (
  2              select clob_obj(job) job from emp where deptno = 10
  3             union
  4              select clob_obj(job) job from emp where deptno = 20
  5            )
  6  select  t.job.c job
  7    from  t t
  8  /

JOB
--------------------------------------------------------------------------------
ANALYST
CLERK
MANAGER
PRESIDENT

SQL> 



SY.
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698549
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, спасибо. Вот только не совсем понятно как работает условие t2.rid < t1.rid ?



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as (
               select rowid rid,to_clob(job) job from emp where deptno = 10
              union all
               select rowid rid,to_clob(job) job from emp where deptno = 20
             )
   select  job
     from  t t1
     where not exists (
                       select  1
                         from  t t2
                         where t2.rid < t1.rid
                           and dbms_lob.compare(t1.job,t2.job) = 0
                      )
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698565
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortisВот только не совсем понятно как работает условие t2.rid < t1.rid ?


Зачем сравнивать Y c X если мы уже сравнили X с Y.

SY.
...
Рейтинг: 0 / 0
CLOB в UNION - ошибка несовместимый тип данных
    #39698576
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis,

Упс, забыл про NULL (решение с типом + ORDER метод их учитывает). С учетом NULL:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> with t as (
  2              select rowid rid,to_clob(job) job from emp where deptno = 10
  3             union all
  4              select rowid rid,to_clob(job) job from emp where deptno = 20
  5             union all
  6              select rowid rid,to_clob(null) job from emp where deptno = 30
  7            )
  8  select  rownum,
  9          job
 10    from  t t1
 11    where not exists (
 12                      select  1
 13                        from  t t2
 14                        where t2.rid < t1.rid
 15                             and (
 16                                     dbms_lob.compare(t1.job,t2.job) = 0
 17                                  or
 18                                     nvl(t1.job,t2.job) is null
 19                                 )
 20                     )
 21  /

    ROWNUM JOB
---------- --------------------------------------------------------------------------------
         1 PRESIDENT
         2 CLERK
         3 MANAGER
         4 ANALYST
         5

SQL> 



SY.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLOB в UNION - ошибка несовместимый тип данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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