铸造错误预言机
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) 或这两个字符的组合。逻辑是一样的。
【讨论】:
以上是关于铸造错误预言机的主要内容,如果未能解决你的问题,请参考以下文章