Function PLSQL创建从其他scheme调用过程和函数的包
我试图在SCHEME1中创建一个包(user_mgt),在其中调用SCHEME2中的一个过程(change_pwd)和一个函数(check_password)。我不确定如何正确定义过程和函数中存在的参数和变量。我需要把这两个方案联系起来吗?我想要一些建议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,
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创建同义词。;