Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在PL/SQL中将记录类型验证为函数输入_Oracle_Plsql - Fatal编程技术网

Oracle 如何在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

我正在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 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。您可以简单地将用户名和密码作为两个变量传递给函数。这里不需要收藏。