2010-12-30 18 views
-1

Oracle apexに1つのパッケージを作成しました。コンパイル中にこのようなエラーメッセージが出ました。Apexパッケージのコンパイルエラー

私を助けてください。

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";​ 
+2

どのようなエラーメッセージが表示されますか?あなたを助けるために十分な詳細を私たちに教えてください。 – APC

答えて

4

教育的な推測。最も一般的なコンパイルエラーの原因は、VALID_USER()手順のVALID_USER2()への呼び出しです。私が思う通り、VALID_USER2()がパッケージ仕様で宣言されていない場合、これはPLS-00313の例外である "このスコープでは宣言されていません"を投げ捨てます。

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


実装にはさまざまな問題があります。重要度の低い順に:

  1. これらのコール でUPPER()へとTRIM()GET_HASH()への呼び出しは 見当違いです。 本文(GET_HASH())で使用してください。
  2. (P_PASSWORD IN VARCHAR2,P_USERNAME IN VARCHAR2) の 署名を持っていますが、常に get_hash (p_username, p_password)としてそれを呼び出すGET_HASH()手順。 もちろん、一貫して間違っていると、 は「正しい」 という結果になりますが、それでもエラーです。
  3. 最も気になるところは、ビルトインOracle Application Express Account Credentialsを使用して代わりに の手圧延 認証方式のように見える ということです。なぜあなたは をしていますか?
+0

+1推測ではなく、3点 –

関連する問題