-1

我在 oracle 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";​
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 回答