首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误: ORA-06502: PL/SQL:数值或值错误:字符转换错误

错误: ORA-06502: PL/SQL:数值或值错误:字符转换错误
EN

Stack Overflow用户
提问于 2022-08-02 12:01:50
回答 2查看 166关注 0票数 0

我不明白为什么我会收到这样的错误消息:"ORA-06502: PL/SQL:数值或值错误:字符到数字转换错误“

当我尝试这样的事情(只是一个简单的例子来说明我的问题)时,就会发生这种情况:

代码语言:javascript
运行
复制
create or replace PACKAGE test_package AS 
  FUNCTION fun(x float) return float; 
END test_package; 
/

create or replace PACKAGE BODY test_package AS 

  FUNCTION fun(x float) return float
  IS
  BEGIN    
    return x; 
  END fun;

END;
/

dbms_output.put_line(test_package.fun(0.25)) --ERROR
dbms_output.put_line(test_package.fun(1))    --NO ERROR

如果有人知道原因就好了。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-08-02 12:29:06

确保您的dbms_output调用以分号结尾;否则代码运行良好:

代码语言:javascript
运行
复制
drop package test_package;

create or replace PACKAGE test_package AS 
  FUNCTION fun(x float) return float; 
END test_package; 
/

create or replace PACKAGE BODY test_package AS 

  FUNCTION fun(x float) return float
  IS
  BEGIN    
    return x; 
  END fun;

END;
/

begin
  dbms_output.enable;
  dbms_output.put_line(test_package.fun(0.25));
  dbms_output.put_line(test_package.fun(1));
end;
/

这将返回以下内容:

代码语言:javascript
运行
复制
Package TEST_PACKAGE dropped.


Package TEST_PACKAGE compiled


Package Body TEST_PACKAGE compiled

.25
1


PL/SQL procedure successfully completed.
票数 0
EN

Stack Overflow用户

发布于 2022-08-02 14:02:56

您的示例运行良好;下面是一个简化版本(正如@astentx在其注释中指出的那样- 0.25是一个数字文字,因此不受NLS设置的限制):

代码语言:javascript
运行
复制
declare
  FUNCTION fun(x float) return float
  IS
  BEGIN    
    return x; 
  END fun;
begin
  dbms_output.put_line(fun(0.25));
  dbms_output.put_line(fun(1));
end;

也就是说,如果您碰巧用字符串字面值来调用它,即

代码语言:javascript
运行
复制
begin
  dbms_output.put_line(fun('0.25'));
  dbms_output.put_line(fun('1'));
end;

然后自动转换开始,结果取决于您的NLS设置。在这种情况下,您需要在转换NLS设置时考虑到它,例如通过使用显式to_number()调用NLS_NUMERIC_CHARACTERS:

代码语言:javascript
运行
复制
begin
  dbms_output.put_line(fun(to_number('0.25', '99D99', 'NLS_NUMERIC_CHARACTERS=''.,''')));
  dbms_output.put_line(fun(to_number('1')));
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73207201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档