处理 ORACLE 的 RAW (Archive-Restore)

Posted

技术标签:

【中文标题】处理 ORACLE 的 RAW (Archive-Restore)【英文标题】:Deal with RAW of ORACLE (Archive-Restore) 【发布时间】:2016-03-21 09:09:03 【问题描述】:

我正在处理一个处理 ORACLE 数据库的项目。我的项目有两个功能,一个是将表的内容提取到一个平面文件中,即 backup,第二个是将该平面文件恢复到具有相同结构的空白表,即 restore。

我可以备份和恢复除 RAW|LONG RAW 之外的所有数据类型对象的 oracle 数据库数据。我有一个关于它的问题。例如 我将数据库数据备份到字符串中的平面文件中。喜欢

1,"Name", "Class",12.00 

现在,如果任何表具有 RAW 或 LONG RAW 数据类型,那么在插入表时,它可以使用 RAWTOHEX 方法从任何数据类型插入到原始类型。 为了更好地理解这个案例,我们现在使用两张表。

    一个表说 TBLNUM 及其列 ID NUMBER,RAWINT RAW(2000)

    第二个表说 TBLCHAR 及其列 ID NUMBER、RAWCHAR 原始(2000)

所以我们将数据插入到 TBLNUM 中,将 num 值插入到 raw 中,仅使用数字,TBLCHAR 仅用于字符串。

我对这种类型不太了解。但我可以通过以下方式取回插入的数据 如果我通过 RAWTOHEX(1) 为 RAW 列插入编号,它将以“C102”的形式保存 1 我可以使用以下方法 utl_raw.cast_to_number('C102')

取回 1

我可以为 STRING 做同样的事情 RAWTOHEX('7D') -> 3744 并通过 ult_raw.cast_to_varchar2('3744') -> 7D

取回

首先,如果我错了,请纠正我 其次,如果我是正确的,那么我的问题是如何从平面文件中识别给定的 RAW 列值是从 INTEGER VALUE 或 STRING VALUE 创建的

我想找到解决方案,我可以使用该备份文件将相同的数据插入到不同的数据库表中。并且数据应该插入到我创建平面文件的源表中。

【问题讨论】:

您为什么要编写自己的工具来执行此操作 - 内置导出和导入功能有什么问题?是数据泵,还是来自 SQL Developer 之类的客户端? 该工具可以导出不同类型的数据库数据。它可能是 ORACLE、SQL Server、Postgres 等。所以我们使用 apache 元模型来归档和恢复数据。帮帮我,我该如何处理? 好的,但我仍然不确定我是否理解您的问题。如果您有一个 RAW 列,为什么它包含的内容很重要?只需将 RAW 数据写入您的文件,然后按原样读回即可。为什么要进行任何转换? 【参考方案1】:

我认为备份数据库时不应该更改原始数据类型的值(不要使用cast_to_numbercast_to_varchar2)。因此,将原始数据存储为十六进制字符串,然后将十六进制字符串插入到目的地。当您在 sql developer 中选择原始数据时,它表示为十六进制字符串并将原始数据插入数据库,您的脚本必须包含十六进制字符串:

insert into table1 (num_col, varchar2_col1,varchar2_col2,raw_col)
  values(1, 'Name', 'Class', 'C102')

如果您的程序想要从数据库中提取原始数据,您必须将列值作为 byte[] 并将其写入文件中的十六进制字符串。

【讨论】:

以上是关于处理 ORACLE 的 RAW (Archive-Restore)的主要内容,如果未能解决你的问题,请参考以下文章

linux下ORACLE之RAW创建

oracle中RAW数据类型

oracle中utl_raw

Java ResultSet 方法获取 Oracle RAW 类型

oracle display_raw 用于 varchar 大小超过 32

从 Oracle 的 RAW(16) 转换为 .NET 的 GUID