我的表只包含两行。当我给另一行的empid和密码stil登录完成。这是我的程序
CREATE OR REPLACE PROCEDURE prco_LoginCheck(Emp_Id IN number,
Cpassword In varchar2,
cur_out out Types.cursor_type) AS
BEGIN
open cur_out for
select count(*) from TBL_REGISTRATION a
where a.confirm_password= Cpassword and a.emp_id=Emp_Id;
END prco_LoginCheck;
答案 0 :(得分:4)
除了在表格中存储密码是一种非常不安全的设计(你应该只存储密码的哈希加上一些随机盐)这一事实,以及它对于它没有多大意义定义你自己的弱引用游标类型,而不是使用内置的sys_refcursor
(除非你真的需要使用古老的Oracle版本),并且从一个过程返回一个游标似乎是一个非常奇怪的方法来做一个登录而不是编写返回boolean
或某个指标的函数,问题是命名约定之一。
编写SQL语句时
select count(*)
from TBL_REGISTRATION a
where a.confirm_password= Cpassword
and a.emp_id=Emp_Id;
我认为您的目的是将emp_id
中的tbl_registration
列与emp_id
参数进行比较。然而,这实际上并不是正在发生的事情。您的不合格emp_id
将被解析为表中的列而不是参数。通常,人们使用命名约定来确保参数名称与列名称不匹配。例如,我通常对参数使用p_
前缀,对局部变量使用l_
。这看起来像
CREATE OR REPLACE PROCEDURE prco_LoginCheck(p_Emp_Id IN number,
p_password In varchar2,
p_cur_out out Types.cursor_type) AS
BEGIN
open p_cur_out for
select count(*)
from TBL_REGISTRATION a
where a.confirm_password= p_password
and a.emp_id=p_Emp_Id;
END prco_LoginCheck;
也可以使用现有的参数名称,并完全限定emp_id
以强制它解析为参数名称
CREATE OR REPLACE PROCEDURE prco_LoginCheck(Emp_Id IN number,
Cpassword In varchar2,
cur_out out Types.cursor_type) AS
BEGIN
open cur_out for
select count(*)
from TBL_REGISTRATION a
where a.confirm_password= Cpassword
and a.emp_id=prco_LoginCheck.Emp_Id;
END prco_LoginCheck;