用于验证pl / sql中的用户名和密码的功能

时间:2012-02-18 02:21:27

标签: sql oracle oracle11g ora-06553

我是pl / sql的新手并且遇到了一个我完全坚持的作业问题。

我有一个名为BANKCUSTOMER的表,其中包含以下列:

 USERNAME                                  NOT NULL VARCHAR2(11)
 FAMILY_NAME                               NOT NULL VARCHAR2(25)
 NAME                                      NOT NULL VARCHAR2(25)
 PASSWD                                    NOT NULL VARCHAR2(6)

我想创建一个函数,在用户USERNAME和PASSWORD匹配数据库中的数据时检查数据库。如果登录成功,则应打印出“登录成功!”否则“用户名或密码错误!”

我访问了一个pl / sql教程网站并查看了以下代码,我对其进行了一些修改,以便它可以与我的数据库一起使用,但有些东西我不明白,这就是z number所做的事情。 begin select 1 into z做了什么。有人可以帮我解释一下。

create or replace function log_in(x in varchar2, y in varchar2)   
return varchar2  
as  
  z number;  
begin  
  select 1  
    into z   
    from bankcustomer   
    where username=x   
    and passwd=y;  
  dbms_output.put_line('Login successful!');  
exception  
when no_data_found then  
  dbms_output.put_line('Wrong username or password!'); 
end; 

我想通过编写SELECT log_in() FROM dual;来检查函数是否有效。当我写SELECT log_in() FROM dual;时,我收到一条错误消息:

  

从命令的第1行开始出错:   SELECT log_in()FROM dual   命令行出错:1列:7   错误报告:   SQL错误:ORA-06553:PLS-306:调用'LOG_IN'时参数的数量或类型错误   06553. 00000 - “PLS-%s:%s”   *原因:
  *操作:

我该如何解决这个家庭作业问题?

对不起我的新手问题(希望我能学习以便将来可以帮助别人)。 提前谢谢!

3 个答案:

答案 0 :(得分:2)

您已定义了一个函数,但未从中返回值。鉴于您“选择”该函数,不需要使用dbms_output:

create or replace function log_in(x in varchar2, y in varchar2)
return varchar2
as
  match_count number;
begin
  select count(*)
    into match_count
    from bankcustomer
    where username=x
    and passwd=y;
  if match_count = 0 then
    return 'Wrong username or password!';
  elsif match_count = 1 then
    return 'Login successful!';
  else
    return 'Too many matches, this should never happen!';
  end if;
end;
/

此外,您对该函数的调用不提供用户名和密码参数,这就是您收到错误消息的原因。假设您已将功能更改为实际返回某些内容,则需要使用

SELECT log_in('username', 'secretpassword') FROM dual;

答案 1 :(得分:0)

您是否真的将任何参数传递给log_in函数?什么是logga_in()?后者是你的一个错字吗?

无论如何,select 1 into z仅在未找到匹配的情况下强制执行异常。没什么。

换句话说,您可以在没有它的情况下编写代码,例如使用select count(*) into authenticated ...,然后您可以检查if authenticated != 0并执行相应的操作。我没有Oracle实例所以这段代码是盲目编写的,你需要测试它:

create or replace function log_in(x in varchar2, y in varchar2)
return varchar2
as
  match_count number;
begin
  select count(*)
    into match_count
    from bankcustomer
    where username=x
    and passwd=y;
  if match_count = 0 then
    dbms_output.put_line('Wrong username or password!');
  elsif match_count = 1 then
    dbms_output.put_line('Login successful!');
  else
    dbms_output.put_line('Too many matches, this should never happen!');
end;

答案 2 :(得分:0)

只是为了向已经提供的内容添加更多信息,BEGIN关键字表示执行块的开始;以上是函数头和任何声明语句。

语句 z number; 是一个变量声明语句,声明一个名为z且属于数据类型的变量。 SELECT 1 INTO z WHERE...语句正在检查BANKCUSTOMER表中的行,其中用户名与第一个参数中传递给函数的用户名相匹配,密码与第二个参数中传递给函数的密码相匹配。

如果有一行用户名和密码与传递给函数的内容匹配,那么变量z将包含数字1.如果没有,则Oracle NO_ROWS_FOUND exception将被引发,因为{{1 }}语句必须始终选择一行且只有一行,否则它们将引发异常(SELECT...INTO表示没有行,NO_ROWS_FOUND exception表示多行

希望有用!如果您有更多问题,请随时询问。