Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL*Plus用户输入异常处理_Oracle_Plsql_Oracle11g_Sqlplus - Fatal编程技术网

Oracle SQL*Plus用户输入异常处理

Oracle SQL*Plus用户输入异常处理,oracle,plsql,oracle11g,sqlplus,Oracle,Plsql,Oracle11g,Sqlplus,我有一个简单的问题。 我在代码中声明了两个变量: v_n NUMBER(3) := &sv_n; v_m NUMBER(3) := &sv_m; 如何防止用户输入非数字符号?提出一个例外,或者类似的情况 我试图找到这样的例子,但运气不好。此外,我还尝试编写一个代码来检测输入是否为数字,但问题是,如果我的输入是例如“a”或“acas”或字母中的其他符号,则会引发此错误 Error report: ORA-06550: line 4, column 20: PLS-00201: i

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

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
我甚至无法检查输入是否为数字


有什么解决办法或建议吗?如果我能处理此错误并引发自定义异常,那就太好了。

一个选项是定义SQL*Plus脚本以接受字符串而不是数字,然后定义一个函数,尝试将输入转换为数字。如果您声明一个函数
my\u to\u 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

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