Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function PLSQL创建从其他scheme调用过程和函数的包_Function_Plsql_Package_Procedure - Fatal编程技术网

Function PLSQL创建从其他scheme调用过程和函数的包

Function PLSQL创建从其他scheme调用过程和函数的包,function,plsql,package,procedure,Function,Plsql,Package,Procedure,我试图在SCHEME1中创建一个包(user_mgt),在其中调用SCHEME2中的一个过程(change_pwd)和一个函数(check_password)。我不确定如何正确定义过程和函数中存在的参数和变量。我需要把这两个方案联系起来吗?我想要一些建议 CREATE OR REPLACE PACKAGE user_mgmt AS PROCEDURE CHANGE_PWD (P_USERNAME IN USERS.USERNAME %TYPE,

我试图在SCHEME1中创建一个包(user_mgt),在其中调用SCHEME2中的一个过程(change_pwd)和一个函数(check_password)。我不确定如何正确定义过程和函数中存在的参数和变量。我需要把这两个方案联系起来吗?我想要一些建议

 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;

SCHEME2
可以授予
SCHEME1
运行存储过程的权限(用户和模式在Oracle中几乎是同义词)。 因此,在您的情况下,您应该登录到SCHEMA2并使用
GRANT
语句授予相应的权限:

GRANT EXECUTE ON ... TO a SCHEME1
然后,用户
SCHEME1
将使用
SCHEME2.package\u name.procedure\u name

此外,在
SCHEME1
上,您可以创建一个同义词,以避免每次都以用户名作为前缀

CREATE SYNONYM <synonym_name> FOR SCHEME2.<procedure_name>;
为SCHEME2创建同义词。;