1

我有下表:

create table o_newstdata1 (
field1 raw(8)
);

以下 input.data 文件:

0x12345678
0x1234
0x12

如何将这样的数据插入到我的 o_newstdata1 表中?

我尝试将其加载为 varchar 数据:

load data
INFILE '/export/home/mine/input.data'
replace
into table o_newstdata1
trailing nullcols
(
field1 varchar (8)
)

并查询了这样的内容:

select field1 from o_newstdata1 where utl_raw.cast_to_raw(field1) like '0x1234';

但它不起作用,有什么建议吗?

4

3 回答 3

4

可能有两个错误来源:

  1. 使用 SQL*Loader 加载原始数据
  2. 查询原始数据

要检查查询部分是否有效,请使用以下内容:

CREATE TABLE o_newstdata1 (field1 RAW(8)); 
INSERT INTO o_newstdata1(field1) VALUES ('12AB');
INSERT INTO o_newstdata1(field1) VALUES ('34EF');

您不需要转换为原始格式,可以直接使用 Oracle 的十六进制格式。RAW版本 1 使用来自TO的隐式转换VARCHAR2,版本 2 显式转换:

SELECT * FROM o_newstdata1 WHERE field1 = '12AB';
SELECT * FROM o_newstdata1 WHERE rawtohex(field1)='12AB'; 
于 2013-06-13T11:35:16.160 回答
1

如果您的数据不是真正的二进制/原始数据(如列的大小所示),而只是一个数字,您可以将其存储为一个数字。

十六进制只是表示数字(符号)的一种方式。所以我会把它存储为一个数字,然后在上面放一个视图,这样你就可以直接查看/查询十六进制值。

这样,您甚至可以在数据库中添加或比较这些值。

于 2013-06-13T08:43:02.000 回答
1

数据类型不应该指定为 RAW 吗?

文档

当原始二进制数据“按原样”加载到 RAW 数据库列中时,Oracle 数据库不会对其进行转换。如果将其加载到 CHAR 列中,则 Oracle 数据库将其转换为十六进制。它不能加载到 DATE 或数字列中。

该字段的长度是控制文件中指定的字节数。此长度仅受数据库中目标列的长度和内存资源的限制。长度始终以字节为单位,即使数据文件使用字符长度语义。RAW 数据字段不能分隔。

于 2013-06-13T07:38:09.160 回答