未在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子类型 当前 游标删除存在于外部语言之前
答案 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列上有唯一约束,那么您的身份验证方法才是安全的。如果不是这样,您确实需要一些其他方法来唯一标识数据库中的每个用户,否则您最终可能会以不同的用户身份登录人员。