2013-04-21 64 views
2

我有一个简单的问题。 我宣布我的代码中有两个变量:SQL * Plus用户输入异常处理

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 

我甚至无法检查输入是否为数字。

任何解决方案或建议?如果我能处理这个错误并引发自定义的异常,那将会很好。

回答

3

一种选择是将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 
+0

谢谢贾斯汀,这对我很好:) – kuldarim 2013-04-21 12:15:47

0

ACCEPT工作得很好,没有必要创建存储对象。

20:19:22 [email protected]> 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 [email protected]> @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