Oracle 如何在PL/SQL中将记录类型验证为函数输入
我正在Windows环境中使用Oracle 11g。我不是一个彻底的PL/SQL开发人员。我的情况是这样的 我正在使用一个包,需要验证登录用户。不直接检查表列来执行此操作Oracle 如何在PL/SQL中将记录类型验证为函数输入,oracle,plsql,Oracle,Plsql,我正在Windows环境中使用Oracle 11g。我不是一个彻底的PL/SQL开发人员。我的情况是这样的 我正在使用一个包,需要验证登录用户。不直接检查表列来执行此操作 create or replace package Configuration_pkg as TYPE user_rec IS RECORD (email VARCHAR2(120), password VARCHAR2(120)); TYPE user_tab IS TABLE OF u
create or replace package Configuration_pkg as
TYPE user_rec IS RECORD
(email VARCHAR2(120),
password VARCHAR2(120));
TYPE user_tab IS TABLE OF user_rec INDEX BY BINARY_INTEGER;
function Validate_logged_user (p_user_tab IN user_tab) RETURN VARCHAR2;
end Configuration_pkg;
create or replace package body Configuration_pkg as
function Validate_logged_user (p_user_tab IN user_tab) RETURN VARCHAR2 IS
Ismatching number;
begin
select count(1)
into Ismatching
from CG_M_USERS
where username = user_tab.email
and password = user_tab.password;
if Ismatching = 0 then
return 'Invalid username / password';
elsif Ismatching = 1 then
return 'Login successful';
end if;
end Validate_logged_user;
end Configuration_pkg;
我得到以下错误
Error(10,20): PL/SQL: ORA-00904: "USER_TAB"."PASSWORD": invalid identifier
Error(10,29): PLS-00302: component 'PASSWORD' must be declared
我想用记录类型传递的值验证用户,而不是直接从表中检查用户名和密码。非常感谢大家的帮助。您的代码中几乎没有错误。 1) 您正在使用Oracle保留关键字“PASSWORD”。 2) 您正在将集合传递给函数。因此,您需要运行一个循环来获取集合的值 见修订后的《守则》
CREATE OR REPLACE PACKAGE Configuration_pkg
AS
TYPE user_rec IS RECORD
(
email VARCHAR2 (120),
passwrd VARCHAR2 (120)
);
TYPE user_tab IS TABLE OF user_rec INDEX BY BINARY_INTEGER;
FUNCTION Validate_logged_user (p_user_tab IN user_tab)
RETURN VARCHAR2;
END Configuration_pkg;
----------------------------------------
/
CREATE OR REPLACE PACKAGE BODY Configuration_pkg
IS
FUNCTION Validate_logged_user (p_user_tab IN user_tab)
RETURN VARCHAR2
IS
Ismatching NUMBER;
msg1 varchar2(20):= 'Invalid username/passwrd';
msg2 varchar2(20):= 'Login successful';
BEGIN
for r in 1..p_user_tab.count
loop
SELECT COUNT (1)
INTO Ismatching
FROM CG_M_USERS
WHERE username = p_user_tab(r).email
AND passwrd = p_user_tab(r).passwrd;
IF Ismatching = 0
THEN
RETURN msg1;
ELSIF Ismatching = 1
THEN
RETURN msg2;
END IF;
end loop;
END Validate_logged_user;
END Configuration_pkg;
使用参数名称-
p_user_tab
而不是user_tab
不相关,但是您的CG_M_USERS
表持有明文密码似乎是一个非常糟糕的安全风险。如果您无法摆脱验证用户的业务(即,通过将身份验证委托给外部服务),那么存储一个安全的salt散列会更好。为什么您需要一个记录数组?同意Jeff。您可以简单地将用户名和密码作为两个变量传递给函数。这里不需要收藏。