我是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” *原因:
*操作:
我该如何解决这个家庭作业问题?
对不起我的新手问题(希望我能学习以便将来可以帮助别人)。 提前谢谢!
答案 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
表示多行
希望有用!如果您有更多问题,请随时询问。