oracle数据库提取数据为十六进制如何转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库提取数据为十六进制如何转换相关的知识,希望对你有一定的参考价值。

参考技术A 如果楼主的
substr(XMXM,13,8)
格式完全标准,不存在非16进制的格式,则语句很简单
select
to_number(substr(XMXM,13,8),'xxxxxxxxxx')
from
sonz112;
但如果
substr(XMXM,13,8)
格式存在不标准的情况,则以上语句会报错,无法提出任何结果,这就需要用自定义函数来实现:
create
or
replace
function
test_fun_16to10(str_num
varchar2)
return
number
is
begin
return
to_number(str_num,'xxxxxxxxxx');
exception
when
others
then
return
'';
end;
select
test_fun_16to10(substr(XMXM,13,8),'xxxxxxxxxx')
from
sonz112;
这样对于格式不标准的行,就会返回NULL值。

如何在python中将十六进制字符串转换为二进制以使用cx_oracle插入

【中文标题】如何在python中将十六进制字符串转换为二进制以使用cx_oracle插入【英文标题】:How to convert hex string to binary in python for insert using cx_oracle 【发布时间】:2012-02-11 18:27:19 【问题描述】:

我有一个包含 16 位十六进制数字列表的文本文件(例如“61C7393AA9B3474DB081C7B7CCE1C545”),我需要使用 cx_Oracle 将它们插入一个 Oracle RAW 列。 我试过这个:

sql = "INSERT INTO GUIDS VALUES (HEXTORAW(:1))"
ids = [l.strip() for l in guidfile.readlines()]
cursor.bindarraysize = len(ids)
cursor.setinputsizes(cx_Oracle.BINARY)
cursor.executemany(sql, ids)

但由于 cx_Oracle.DatabaseError: ORA-01036: 非法变量名称/编号而失败。 在调用 executemany 之前,我是否需要在 python 中将值转换为二进制?如果是这样怎么办?请注意,相同的 sql 适用于 cursor.execute 和单个值,它仅适用于我遇到问题的列表。

【问题讨论】:

【参考方案1】:

嗯,我已经通过几种方式解决了这个问题。首先,上面的代码是不正确的,因为它创建了一个值列表,而它应该创建一个元组列表。即

ids = [(l.strip(),) for l in guidfile.readlines()]

然后使用

cursor.setinputsizes(cx_Oracle.STRING)

它有效。 在最初的问题上 - 如何摆脱 hextoraw,我发现这是可行的:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)

【讨论】:

以上是关于oracle数据库提取数据为十六进制如何转换的主要内容,如果未能解决你的问题,请参考以下文章

oracle迁移postgres之-Ora2Pg

Oracle - ORA-01422:精确提取返回的行数超过了请求的行数

如何将此混合行/列表转换为所需的输出。 (Oracle SQL/发行版:Ora12c)

Pentaho Spoon 转换抛出:ORA-01652:无法在表空间 TEMP 中将临时段扩展 128

oracle ORA-01840:输入值对于日期格式不够长,请高手帮忙。有非法数据?怎么处理?

oracle 数据库ora-01408是啥错误