以下代码在SQL Developer中运行良好,没有任何错误,但是当我在SQL * Plus中运行代码时,它会抛出错误。
declare
v_num1 integer := '&a';
v_num2 integer := '&b';
v_result number;
begin
v_result := v_num1 / v_num2;
dbms_output.put_line ('v_result: '||v_result);
end;
引发的错误是
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 2
请指出我所犯的错误。
答案 0 :(得分:1)
您的SQL * Plus会话已关闭替换变量,因此'&a'
被视为文字字符串,并且不会提示您输入值。在简化版中:
set define off
declare
i integer := to_number('&a');
begin
null;
end;
/
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 2
要修复它,请重新打开替换变量:
set define &
然后它起作用:
declare
i integer := to_number('&a');
begin
null;
end;
/
Enter value for a:
如果我输入1:
PL/SQL procedure successfully completed.
您不需要引号或to_number()
,除非您正在使用组分隔符(然后您还需要提供格式模型)。你可以这样做:
declare
i integer := &a;
begin
null;
end;
/
如你所知,你正在进行不必要的隐式字符串到数字的转换。
如果您没有明确关闭它们,那么您可能有site or user profile正在执行set define off
以及其他配置设置。它可能是出于某种原因,但如果您目前只有一个站点配置文件,那么您可以创建自己的用户配置文件来覆盖它。只要知道你改变的任何事情的影响;您可能有其他依赖它的脚本,例如如果您的数据有&符号,并且已被禁用以防止解释这些问题。