Как записать шестнадцатеричные символы FF в файл из поля типа CLOB, используя UTL_FILE?

Кто-нибудь знает, как вставить в таблицу с полями типа «clob» данные, которые после использования utl_file будут выглядеть в результирующем файле как FF FF FF FF в hex-редакторе? Я сделал следующее (и много других попыток):

INSERT INTO DATA.FILE_TAB
(A1 --CLOB type field
)
select 
LPAD(chr(to_number('FF', 'XX')), 22, chr(to_number('FF', 'XX'))) A1
from DUAL;

после вставки я использую utl_file (put_line) для создания файла .dat в каталоге. Когда я открыл его, я увидел что угодно, но не нужные символы. =( В hex-редакторе мне нужно увидеть символы FF FF FF FF FF FF как по ссылке .


person May12    schedule 21.08.2012    source источник
comment
Запустите следующий запрос: SELECT * FROM NLS_DATABASE_PARAMETERS и сообщите мне, что он возвращает для PARAMETER_NAME = 'NLS_CHARACTERSET' и PARAMETER_NAME = 'NLS_SAVED_NCHAR_CS'.   -  person Bob Jarvis - Reinstate Monica    schedule 21.08.2012
comment
NLS_CHARACTERSET = AL32UTF8 и NLS_NCHAR_CHARACTERSET = AL16UTF16   -  person May12    schedule 21.08.2012
comment
Обратите внимание, что если вы измените A1 на BLOB, будет работать следующее: INSERT INTO DATA.FILE_TAB(A1) VALUES (LPAD(HEXTORAW('FF'), 22, HEXTORAW('FF'))).   -  person Bob Jarvis - Reinstate Monica    schedule 21.08.2012
comment
LPAD(HEXTORAW('FF'), 22, HEXTORAW('FF')) в моем случае не работает (NLS_CHARACTERSET = AL32UTF8)   -  person May12    schedule 21.08.2012
comment
Учитывая ваши наборы символов, я ожидаю, что это сработает. Однако я не могу проверить это, так как все имеющиеся у меня базы данных используют US7ASCII. Кажется, вы хотите хранить двоичные данные — не могли бы вы преобразовать A1 в BLOB вместо CLOB? Кроме того, как я уже отмечал выше, LPAD(HEXTORAW('FF'), 22, HEXTORAW('FF')) работает только в том случае, если A1 является BLOB.   -  person Bob Jarvis - Reinstate Monica    schedule 21.08.2012
comment
a не может преобразовать clob в blob, потому что в этом случае я не могу объединять поля. я пробовал.   -  person May12    schedule 21.08.2012


Ответы (1)


Для этой цели вы можете использовать пакет UTL_RAW.

insert into data.file_tab(a1)
values (lpad(utl_raw.cast_to_varchar2('FF'), 22, utl_raw.cast_to_varchar2('FF')));
person Marcin Wroblewski    schedule 21.08.2012
comment
Результаты вашего запроса, по-видимому, зависят от используемого набора символов. В нашей базе данных с NLS_CHARACTERSET = 'US7ASCII' я получаю '7F7F7F...', то есть старший бит усекается. - person Bob Jarvis - Reinstate Monica; 21.08.2012