SQL Developer和SQL * Plus中的执行差异

时间:2014-01-07 09:28:26

标签: sqlplus oracle-sqldeveloper

以下代码在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

请指出我所犯的错误。

1 个答案:

答案 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以及其他配置设置。它可能是出于某种原因,但如果您目前只有一个站点配置文件,那么您可以创建自己的用户配置文件来覆盖它。只要知道你改变的任何事情的影响;您可能有其他依赖它的脚本,例如如果您的数据有&符号,并且已被禁用以防止解释这些问题。