在创建存储过程时遇到符号声明

时间:2014-06-22 08:46:27

标签: oracle plsql

未在Oracle SQL Developer

中创建以下过程
 CREATE OR REPLACE PROCEDURE CheckUser(UserName IN VARCHAR2,Password IN VARCHAR2)
  AS
 DECLARE Counts int;
 BEGIN 
    SELECT COUNT(UserNames) INTO Counts FROM tblUsers
    WHERE UserNames = UserName and Passwords = Password;
  IF Counts = 1 THEN
       SELECT 1 AS Code;
  ELSE
      SELECT -1 AS Code;
 END;

当我运行上述过程时,SQL Developer中会返回以下错误消息:

PROCEDURE CHECKUSER compiled
Errors: check compiler log
  

错误(3,1):PLS-00103:遇到符号" DECLARE"什么时候期待   以下之一:begin function pragma procedure子类型        当前   游标删除存在于外部语言之前

1 个答案:

答案 0 :(得分:1)

要实际检讨错误:

  • 过程声明CREATE OR REPLACE ...是DECLARE块;你可以删除DECLARE;有关详细信息,请参阅the documentation

  • 您需要select from something,这通常是table DUAL,这是为此目的而设计的,即

    select 1 as code from dual
    
  • 如果要在过程中选择数据,则需要SELECT INTO变量。你这是第一次,但不是第二次,即

    select 1 into <some variable> from dual
    
  • INT不是数据类型; it's INTEGER,这是NUMBER的同义词(38,0

  • 据我所知,实际上根本没有使用返回代码...我假设你在这里验证用户,这意味着你需要告诉调用程序它是否成功

  • 如果您想要返回一个值,您可能需要一个函数,而不是一个过程。

  • 为了得出这个合乎逻辑的结论,你的IF语句是不必要的; COUNT(*)将返回1或0,具体取决于用户名和密码是否存在...而是将其用作布尔值True / False。

  • 我希望这是密码哈希而不是实际密码......

  • 通常最好明确命名约定并从列名等中分离出参数,以使其更易于阅读,并且不太可能导致Oracle阻碍范围。

把所有这些放在一起你最终会得到这样的结果:

create or replace function check_user (
    PUsername in varchar2, PPassword_Hash in varchar2
     ) return number is

   l_exists number;

begin

   select count(*) into l_exists
     from tblUsers
    where username = PUsername
      and password = PPassword_Hash
          ;

   return l_exists;

end;
/

值得注意的是,如果您确保人们只能拥有一个用户名,即TBLUSERS在USERNAME列上有唯一约束,那么您的身份验证方法才是安全的。如果不是这样,您确实需要一些其他方法来唯一标识数据库中的每个用户,否则您最终可能会以不同的用户身份登录人员。