PLSQL 创建一个从其他方案调用过程和函数的包

Posted

技术标签:

【中文标题】PLSQL 创建一个从其他方案调用过程和函数的包【英文标题】:PLSQL Creating a package that calls on procedures and functions from other scheme 【发布时间】:2018-05-24 18:55:50 【问题描述】:

我正在尝试在 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;

【问题讨论】:

【参考方案1】:

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>;

【讨论】:

以上是关于PLSQL 创建一个从其他方案调用过程和函数的包的主要内容,如果未能解决你的问题,请参考以下文章

ORA-24344: 尝试在 plsql 中创建函数时编译错误成功

plsql - 从另一个模式调用过程

PLSQL子程序即PLSQL块

如何从包中删除过程或函数

Oracle PLSQL怎么用调用函数包

我用plsql创建的存储过程为啥是无效的?