2016-09-13 13 views
-1

Windows環境でOracle 11gを使用しています。私は完全なPL/SQL開発者ではありません。私の状況はこのようなものです。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

使用パラメータ名 - '代わりに無関係user_tab' –

+2

'のp_user_tab'が、あなたの 'CG_M_USERS'テーブルはクリアテキストのパスワードを保持し、本当に悪いセキュリティリスクのように思えます。ユーザーを検証するビジネスから抜け出せない場合(つまり、外部サービスに認証を委任することによって)、塩漬けの安全なハッシュを格納する方がはるかに優れています。 –

+2

なぜここにレコードの配列が必要ですか? –

答えて

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; 
関連する問題