我不明白为什么我会收到这样的错误消息:"ORA-06502: PL/SQL:数值或值错误:字符到数字转换错误“
当我尝试这样的事情(只是一个简单的例子来说明我的问题)时,就会发生这种情况:
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
如果有人知道原因就好了。谢谢。
发布于 2022-08-02 12:29:06
确保您的dbms_output
调用以分号结尾;否则代码运行良好:
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;
/
这将返回以下内容:
Package TEST_PACKAGE dropped.
Package TEST_PACKAGE compiled
Package Body TEST_PACKAGE compiled
.25
1
PL/SQL procedure successfully completed.
发布于 2022-08-02 14:02:56
您的示例运行良好;下面是一个简化版本(正如@astentx在其注释中指出的那样- 0.25是一个数字文字,因此不受NLS设置的限制):
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;
也就是说,如果您碰巧用字符串字面值来调用它,即
begin
dbms_output.put_line(fun('0.25'));
dbms_output.put_line(fun('1'));
end;
然后自动转换开始,结果取决于您的NLS设置。在这种情况下,您需要在转换NLS设置时考虑到它,例如通过使用显式to_number()调用NLS_NUMERIC_CHARACTERS:
begin
dbms_output.put_line(fun(to_number('0.25', '99D99', 'NLS_NUMERIC_CHARACTERS=''.,''')));
dbms_output.put_line(fun(to_number('1')));
end;
https://stackoverflow.com/questions/73207201
复制相似问题