首页 文章

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

提问于
浏览
1

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 回答

  • 1

    要真正检查你的错误:

    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列上有唯一约束,那么您的身份验证方法才是安全的 . 如果不是这样,您确实需要一些其他方法来唯一标识数据库中的每个用户,否则您最终可能会以不同的用户身份登录人员 .

相关问题