2015-07-21 2 views
0

Я хочу выбрать и визуализировать содержимое столбца с типом данных (> 100 байт).Как визуализировать содержимое CLOB - Oracle

select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(ds_cirurgia,1,4000)) 
    from AVISO_CIRURGIA 
where cd_paciente = 123456789; 

Но я получаю эту ошибку:

[SELECT - 0 row(s), 0.000 secs] [Error Code: 997, SQL State: 42000] ORA-00997: illegal use of LONG datatype 

Я использовал UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR()) в другой колонке, и она работает.

Что не так в этом случае?

+0

, пожалуйста, опубликуйте результат select data_type из user_tab_columns, где table_name = 'AVISO_CIRURGIA' и column_name = upper ('ds_cirurgia'); –

+0

Для CLOB вы можете использовать функцию GetClobVal() –

+0

Привет @MarmiteBomber. Спасибо за помощь. Я выполнил запрос, который вы предложили, но, похоже, мой user_tab_columns пуст. Когда я выполняю простой выбор, например: «выберите ds_cirurgia из AVISO_CIRURGIA», он показывает мне каждую строку как «CLOB, размер в байтах», например: «CLOB, 202 байта» в первой строке «CLOB, 482 байта», во второй строке .... –

ответ

0

Вы можете просто оставить его с вызовом DBMS_LOB.SUBSTR: он возвращает varchar2:

select DBMS_LOB.SUBSTR(ds_cirurgia,1,4000) 
from AVISO_CIRURGIA 
where cd_paciente = 123456789 

Однако, имейте в виду, что Oracle SQL способен только наличия varchar2 с 4000 байт, а не 4000 символов. Ваш вызов может завершиться неудачно, если строка содержит символы Unicode.

+0

Почему вы редактируете в своей собственной версии правды. Пусть OP отредактирует свой вопрос, если вы правы, но я вас не понимаю. –

+0

сделано и жаль, что вы видите, что я немного перевернулся сегодня ... –

0

Тип вашей колонки: LONG не CLOB. Простой поиск в USER_TAB_COLUMNS.

Here некоторые способы решения проблемы. Я бы рекомендовал изменить тип на CLOB с помощью CTAS.

create table t1 as 
select ... 
to_lob(c) c /* convert to CLOB */ 
from t; 

После этого вы можете просто приведение к VARCHAR, такие как

cast (substr(col_name,1,4000) as varchar2(4000)) 

UPDATE

, конечно, вы можете также использовать DBMS_LOB.SUBSTR

DBMS_LOB.SUBSTR(col_name,4000,1) 

но обратите внимание, подпись этой функции: 2-й параметр - длина, 3 rd offset (не наоборот, как в substr).

Смежные вопросы