Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLOB в UNION - ошибка несовместимый тип данных / 8 сообщений из 8, страница 1 из 1
05.09.2018, 12:28
    #39698370
rigor mortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
Привет,
что-то затруднился. Есть 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
05.09.2018, 12:33
    #39698375
rimall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
+ столбец md5(text)
...
Рейтинг: 0 / 0
05.09.2018, 13:34
    #39698448
rigor mortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
rimall, но если добавить md5(text) и оставить text это проблему не решит. Удалить text нельзя, мне нужно вернуть его содержимое. Или я не так понял?
...
Рейтинг: 0 / 0
05.09.2018, 14:15
    #39698497
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
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
05.09.2018, 14:27
    #39698505
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
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
05.09.2018, 14:57
    #39698549
rigor mortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
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
05.09.2018, 15:19
    #39698565
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
rigor mortisВот только не совсем понятно как работает условие t2.rid < t1.rid ?


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

SY.
...
Рейтинг: 0 / 0
05.09.2018, 15:29
    #39698576
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CLOB в UNION - ошибка несовместимый тип данных
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / CLOB в UNION - ошибка несовместимый тип данных / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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