登录过程在oracle 11g中不起作用

时间:2014-10-15 06:50:47

标签: oracle plsql procedure

我的表只包含两行。当我给另一行的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;

1 个答案:

答案 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;