-1

Oracle apex で 1 つのパッケージを作成しました。コンパイル中に、このようなエラーメッセージが表示されました..

私を助けてください。

create or replace package body "PKG_APP_SECURITY" is
procedure ADD_USER(P_PASSWORD IN VARCHAR2
      ,P_USERNAME IN VARCHAR2
)
as
begin
 INSERT INTO P_USERS(username, password)
    VALUES (UPPER (p_username),get_hash(TRIM(p_username), p_password));

COMMIT; 
EXCEPTION
   WHEN OTHERS THEN ROLLBACK; RAISE;
end ADD_USER;

function VALID_USER(P_PASSWORD IN VARCHAR2
      ,P_USERNAME IN VARCHAR2
) return BOOLEAN

as
begin
 VALID_USER2(UPPER(p_username),p_password);
 RETURN TRUE;
EXCEPTION 
 WHEN OTHERS THEN RETURN FALSE;
end VALID_USER;

function GET_HASH(P_PASSWORD IN VARCHAR2
      ,P_USERNAME IN VARCHAR2
) RETURN VARCHAR2 AS 
    BEGIN 
    RETURN 
       DBMS_OBFUSCATION_TOOLKIT.md5(input_string => UPPER (p_username) || '/' || UPPER (p_password));
end GET_HASH;

procedure LOGIN(P_FLOW_PAGE IN VARCHAR2
      ,P_PASSWORD IN VARCHAR2
      ,P_SESSION_ID IN VARCHAR2
      ,P_USERNAME IN VARCHAR2
)
is
begin
-- THIS PROVIDES AUTHENTICATION
     wwv_flow_custom_auth_std.login 
       (p_uname => p_uname
          ,p_password => p_password
            ,p_session_id => p_session_id
           ,p_flow_page => p_flow_page || ':' || 1);
end LOGIN;

procedure VALID_USER2(       P_PASSWORD IN VARCHAR2
      ,P_USERNAME IN VARCHAR2
)
as
begin
 SELECT '1'
 INTO v_dummy 
 FROM P_USERS
 WHERE UPPER(username) = UPPER (p_username)
 AND password= get_hash (p_username, p_password);

EXCEPTION 
   WHEN NO_DATA_FOUND THEN 
   raise_application_error(-20000, 'Invalid username / password.');
end VALID_USER2;

end "PKG_APP_SECURITY";​
4

1 に答える 1

4

知識に基づく推測。コンパイル エラーの原因として最も可能性が高いのはVALID_USER2()VALID_USER()プロシージャ内での呼び出しです。私VALID_USER2()が推測するように、パッケージ仕様で宣言されていない場合、これは PLS-00313 例外「このスコープで宣言されていません」をスローします。

プライベート関数は、呼び出す前に宣言する必要があります。代替は前方宣言ですが、それは常に不必要な重複として私を襲っています。


実装に関して厄介なことがいくつかあります。重大度の昇順:

  1. UPPER()への呼び出しとTRIM()への呼び出し内のそれらの呼び出しGET_HASH()は間違っています。それらを本体で使用するだけGET_HASH()です。
  2. プロシージャGET_HASH()には の署名(P_PASSWORD IN VARCHAR2,P_USERNAME IN VARCHAR2) がありますが、常に として呼び出します get_hash (p_username, p_password)。もちろん、一貫して間違っているということは、「正しい」結果が得られることを意味しますが、それでもエラーです。
  3. 最も心配なのは、組み込みのOracle Application Express Account Credentialsを使用する代わりに、認証スキームを手動でロールしているように見えることです。どうしてそんなことをするのか?
于 2010-12-30T09:00:25.127 に答える