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 创建一个从其他方案调用过程和函数的包的主要内容,如果未能解决你的问题,请参考以下文章