如何在PL / SQL中将记录类型验证为函数输入

时间:2016-09-13 11:24:44

标签: 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 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 个答案:

答案 0 :(得分:1)

您的代码中几乎没有错误。 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;