【问题标题】:SQL*Plus user input exception handlingSQL*Plus 用户输入异常处理
【发布时间】:2013-04-14 07:40:10
【问题描述】:

我有一个简单的问题。 我在代码中声明了两个变量:

v_n NUMBER(3) := &sv_n;
v_m NUMBER(3) := &sv_m;

如何防止用户输入不是数字符号?并引发异常,或类似的事情。

我试图找到这样的例子,但没有运气。我还尝试编写一个代码来检测输入是否为数字,但问题是,如果我的输入是例如“a”或“acas”或来自字母的其他符号,则会引发此错误

Error report:
ORA-06550: line 4, column 20:
PLS-00201: identifier 'A' must be declared
ORA-06550: line 4, column 7:
PL/SQL: Item ignored

而且我什至无法检查输入是否为数字。

对此有任何解决方案或建议吗?如果我能处理这个错误并引发自定义异常,那就太好了。

【问题讨论】:

    标签: oracle plsql oracle11g sqlplus


    【解决方案1】:

    一种选择是定义 SQL*Plus 脚本以接受字符串而不是数字,然后定义一个尝试将输入转换为数字的函数。如果你声明一个函数my_to_number

    SQL> ed
    Wrote file afiedt.buf
    
      1  create or replace function my_to_number( p_str in varchar2 )
      2    return number
      3  is
      4    l_num number;
      5  begin
      6    l_num := to_number( p_str );
      7    return l_num;
      8  exception
      9    when others
     10    then
     11      raise_application_error( -20001, p_str || ' is not a number' );
     12* end;
    SQL> /
    
    Function created.
    

    然后您的 SQL*Plus 脚本可能看起来像这样。如果用户输入了一个有效的数字,脚本就会按预期工作。如果不是,则会引发函数中定义的自定义错误。

    SQL> declare
      2    v_n number(3) := my_to_number( '&sv_n' );
      3  begin
      4    dbms_output.put_line( 'The number is ' || v_n );
      5  end;
      6  /
    Enter value for sv_n: 123
    old   2:   v_n number(3) := my_to_number( '&sv_n' );
    new   2:   v_n number(3) := my_to_number( '123' );
    The number is 123
    
    PL/SQL procedure successfully completed.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  declare
      2    v_n number(3) := my_to_number( '&sv_n' );
      3  begin
      4    dbms_output.put_line( 'The number is ' || v_n );
      5* end;
    SQL> /
    Enter value for sv_n: abc
    old   2:   v_n number(3) := my_to_number( '&sv_n' );
    new   2:   v_n number(3) := my_to_number( 'abc' );
    declare
    *
    ERROR at line 1:
    ORA-20001: abc is not a number
    ORA-06512: at "SCOTT.MY_TO_NUMBER", line 11
    ORA-06512: at line 2
    

    【讨论】:

      【解决方案2】:

      ACCEPT 效果很好,不需要创建存储对象。

      20:19:22 SYSTEM@sandbox> get s:\test\123.sql
        1   accept n number prompt "enter number value: "
        2   declare
        3    myVar number := &n.;
        4   begin
        5    dbms_output.put_line(myVar);
        6*  end;
      20:19:30 SYSTEM@sandbox> @s:\test\123.sql
      enter number value: adsfadsf
      SP2-0425: "adsfadsf" is not a valid NUMBER
      enter number value: 12341324
      12341324
      
      PL/SQL procedure successfully completed.
      
      Elapsed: 00:00:00.01
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        相关资源
        最近更新 更多