我有一个简单的问题。 我在代码中声明了两个变量:
v_n NUMBER(3) := &sv_n;
v_m NUMBER(3) := &sv_m;
如何阻止用户输入数字simbol?并提出异常,或类似的东西。
我试图找到这样的例子,但没有运气。此外,我试图编写一个代码来检测输入是否为数字,但问题是,如果我的输入是例如'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
我甚至无法检查输入是否为数字。
有任何解决方案或建议吗?如果我能处理这个错误并引发自定义异常会很好。
答案 0 :(得分: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
答案 1 :(得分:0)
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