【问题标题】:How to write hex FF symbols into file from CLOB-type field using UTL_FILE?如何使用 UTL_FILE 从 CLOB 类型字段将十六进制 FF 符号写入文件?
【发布时间】:2012-08-16 16:56:01
【问题描述】:

有人知道如何在字段类型为 «clob» 的表中插入一个数据,在使用 utl_file 后,该数据将在十六进制编辑器中的 FF FF FF FF 等结果文件中查找? 我做了下一个(以及许多其他尝试):

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 文件。当我打开它时,我看到了任何东西,但不需要字符。 =(在十六进制编辑器中,我需要通过link 看到符号 FF FF FF FF FF FF。

【问题讨论】:

  • 运行以下查询:SELECT * FROM NLS_DATABASE_PARAMETERS 并告诉我它为 PARAMETER_NAME = 'NLS_CHARACTERSET'PARAMETER_NAME = 'NLS_SAVED_NCHAR_CS' 返回什么。
  • NLS_CHARACTERSET = AL32UTF8 和 NLS_NCHAR_CHARACTERSET = AL16UTF16
  • 请注意,如果您将 A1 更改为 BLOB,则以下内容将起作用:INSERT INTO DATA.FILE_TAB(A1) VALUES (LPAD(HEXTORAW('FF'), 22, HEXTORAW('FF')))
  • LPAD(HEXTORAW('FF'), 22, HEXTORAW('FF')) 在我的情况下不起作用(NLS_CHARACTERSET = AL32UTF8)
  • 鉴于您的字符集,我希望这可以工作。不过,我无法测试它,因为我可用的数据库都使用 US7ASCII。您似乎想要存储二进制数据 - 您可以将 A1 转换为 BLOB 而不是 CLOB 吗?另外,正如我上面提到的,LPAD(HEXTORAW('FF'), 22, HEXTORAW('FF')) 仅在 A1 是 BLOB 时才有效。

标签: oracle plsql hex clob utl-file


【解决方案1】:

您可以为此目的使用UTL_RAW

insert into data.file_tab(a1)
values (lpad(utl_raw.cast_to_varchar2('FF'), 22, utl_raw.cast_to_varchar2('FF')));

【讨论】:

  • 您的查询结果似乎取决于所使用的字符集。在我们的数据库中,使用 NLS_CHARACTERSET = 'US7ASCII',我得到 '7F7F7F...' - 即高位被截断。
猜你喜欢
  • 2021-10-27
  • 2013-05-03
  • 2014-03-16
  • 2010-11-26
  • 2013-01-07
  • 2010-10-12
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多