PLSQL Создание пакета, который вызывает процедуры и функции из другой схемы - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь создать пакет (user_mgt) в SCHEME1, где он вызывает процедуру (change_pwd) и функцию (check_password) из SCHEME2.Я не совсем уверен, как правильно определить параметры и переменные, которые существуют в процедуре и функции.Нужно ли как-то соединять эти две схемы?Очень хотелось бы несколько советов!

 CREATE OR REPLACE PACKAGE user_mgmt AS

    PROCEDURE CHANGE_PWD (P_USERNAME IN USERS.USERNAME %TYPE,                                         
                                    P_OLD_PW   USERS.PASSWORD%TYPE,                                     
                                    P_NEW_PW IN USERS.PASSWORD %TYPE, 
                                    P_SUCCES OUT BOOLEAN );

    FUNCTION check_password 
(P_USERNAME IN VARCHAR2, 
P_PASSWORD IN VARCHAR2) 
RETURN BOOLEAN IS 
V_CHECK NUMBER(1); 

end user_mgmt;
/

CREATE OR REPLACE PACKAGE BODY user_mgmt AS

PROCEDURE CHANGE_PWD (P_USERNAME IN USERS.USERNAME %TYPE,                                         
                                    P_OLD_PW  IN USERS.PASSWORD%TYPE,                                     
                                    P_NEW_PW IN USERS.PASSWORD%TYPE, 
                                    P_SUCCES OUT BOOLEAN ) IS
 VC_OLD_PW   USERS.PASSWORD%TYPE;

 BEGIN

    SELECT U.PASSWORD 
      INTO VC_OLD_PW 
      FROM USERS U
     WHERE U.USERNAME = p_username;


   IF VC_OLD_PW = P_OLD_PW THEN
      UPDATE USERS
         SET PASSWORD = p_new_pw
       WHERE USERS.USERNAME = p_username;
       COMMIT;

      P_SUCCES   := TRUE;
   ELSE 

      P_SUCCES  := FALSE;

   END IF;

EXCEPTION

WHEN OTHERS THEN    
    P_SUCCES  := FALSE;   
    DBMS_OUTPUT.PUT_LINE('Error in procedure CHANGE_PWD '||SQLERRM);
END CHANGE_PWD;


FUNCTION check_password     (P_USERNAME IN VARCHAR2, 
                            P_PASSWORD IN VARCHAR2) 
                            RETURN BOOLEAN IS 
V_CHECK NUMBER(1); 

    BEGIN 

        SELECT 1 INTO V_CHECK
        FROM USERS
        WHERE UPPER(P_USERNAME) = UPPER(USERS.USERNAME) 
        AND (P_PASSWORD) = (USERS.PASSWORD); 

RETURN TRUE; 

        EXCEPTION 
        WHEN NO_DATA_FOUND THEN return false; 
        WHEN OTHERS THEN return false; 
        End check_password;


END user_mgmt;

1 Ответ

0 голосов
/ 25 мая 2018

SCHEME2 может предоставить SCHEME1 разрешение на запуск хранимой процедуры (пользователь и схема в значительной степени синонимичны в Oracle).Таким образом, в вашем случае вы должны войти в SCHEMA2 и дать соответствующие разрешения, используя оператор GRANT:

GRANT EXECUTE ON ... TO a SCHEME1

Пользователь SCHEME1 затем вызовет процедуру, используя SCHEME2.package_name.procedure_name

Более того, на SCHEME1 вы можете создать синоним, чтобы избежать префикса с именем пользователя каждый раз

CREATE SYNONYM <synonym_name> FOR SCHEME2.<procedure_name>;
...