铸造错误预言机

Posted

技术标签:

【中文标题】铸造错误预言机【英文标题】:Casting error oracle 【发布时间】:2017-10-30 14:14:21 【问题描述】:

我已经尝试过 [CAST & TO_NUMBER] 两种方法,但都无法转换从另一个过程返回的值。

SELECT DBMS_LOB.SUBSTR(SUBSTR(DETAIL_LOB, 2300, 4), 2000) 
  INTO RES 
FROM lONG_TO_CLOB_TEMP_TABLE;`

上述查询返回的 RES VALUE 为 40。

RES 数据类型是 varchar2。

现在我想将该 RES 值转换为数字,以便可以对此进行一些算术运算。

喜欢 => 100/RES

不工作的代码 =>

V_TEMP := CAST(RES AS NUMBER)
V_TEMP := TO_NUMBER(RES)

错误消息 => "ORA-06502: PL/SQL: 数值或数值错误"

【问题讨论】:

不相关的...你不能只使用DBMS_LOB.SUBSTR吗? 那是我更新的复制粘贴错误。 @KaushikNayak 我正在从 DETAIL 列中搜索一个特定值,这就是为什么还要使用 SUBSTR。 您确定数字错误是在演员表上,而不是您在代码中执行的实际除法运算吗? 那么很可能除了“40”之外还有其他字符被获取,换行符可能......或者你的V_TEMP变量长度更短。 【参考方案1】:

它最可能的特殊字符涉及(空格或换行符)

试试

V_TEM := To_number(regexp_replace(trim(RES), '(^[[:space:]]+)|([[:space:]]+$)',null))

【讨论】:

【参考方案2】:

有一个换行导致问题。

解决方法:-

REPLACE(REPLACE(REPLACE(column_name, CHR(10)), CHR(13)), CHR(9));

--特别感谢@KaushikNayak

【讨论】:

【参考方案3】:

要使用 PL/SQL 删除换行符,请使用以下命令:

declare charwithnewline VARCHAR2(10) := CONCAT('190', CHR(13));
begin
dbms_output.put_line('+++++++++++++++++++++++++');
dbms_output.put_line(charwithnewline);
dbms_output.put_line('+++++++++++++++++++++++++');
dbms_output.put_line(REPLACE(charwithnewline,CHR(13),''));
dbms_output.put_line('+++++++++++++++++++++++++');
end; 

注意:换行符可以是 CHR(13) 或 CHR(10) 或这两个字符的组合。逻辑是一样的。

【讨论】:

以上是关于铸造错误预言机的主要内容,如果未能解决你的问题,请参考以下文章

区块链预言机预言机原理

预言机智能合约与预言机服务的交互

Chainlink平台预言机

Chainlink平台预言机

去中心化预言机网络ADAMoracle提供预言机整体解决方案

听说过”Blockchain oracles“吗?(区块链预言机)