2013-04-21 96 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