我需要将我写入的SQL脚本包装成一个包,因为......工作。
我真的迷失在PL / SQL中,并且不知道我做错了什么:
CREATE OR REPLACE PACKAGE F_LOG_ARCHIVE_PKG AS
PROCEDURE LOG_ARCHIVE;
END F_LOG_ARCHIVE_PKG;
/************************ F_BUSINESS_IDENTIFIER ********************************/
/
CREATE OR REPLACE PACKAGE BODY F_LOG_ARCHIVE_PKG AS
PROCEDURE LOG_ARCHIVE IS
BEGIN
INSERT INTO LOGARC.F_BUSINESS_IDENTIFIER ("ID",
"SERVICE_ID",
"OPERATION_ID",
"BUSINESS_IDENTIFIER_NAME",
"BUSINESS_IDENTIFIER_VALUE",
"EXCEPTION_ROW_ID",
"ARCHIVE_DATE")
SELECT DISTINCT ORIGINAL."ID",
ORIGINAL.SERVICE_ID,
ORIGINAL.OPERATION_ID,
ORIGINAL.BUSINESS_IDENTIFIER_NAME,
ORIGINAL.BUSINESS_IDENTIFIER_VALUE,
ORIGINAL.EXCEPTION_ROW_ID,
sysdate
FROM LOGUSR.F_BUSINESS_IDENTIFIER ORIGINAL
--Latest exception date based on service id and operation id
INNER JOIN (SELECT F_EXCEPTION.SERVICE_ID,
F_SERVICE_OPERATION_NAME.ID AS OPERATION_ID,
MAX(RECORD_CREATED_DATE) AS RECORD_CREATED_DATE,
MAX(EXCEPTION_DATE) AS EXCEPTION_DATE
FROM LOGUSR.F_EXCEPTION
INNER JOIN LOGUSR.F_SERVICE_OPERATION_NAME
ON F_EXCEPTION.OPERATION_NAME = F_SERVICE_OPERATION_NAME.OPERATION_NAME
GROUP BY F_EXCEPTION.SERVICE_ID,F_SERVICE_OPERATION_NAME.ID) EXCEPTION_DATE
ON ORIGINAL.SERVICE_ID = EXCEPTION_DATE.SERVICE_ID
AND ORIGINAL.OPERATION_ID = EXCEPTION_DATE.OPERATION_ID
--Service name to join to F_SERVICE_LOGSTATUS table
INNER JOIN LOGUSR.F_SERVICE_NAME
ON ORIGINAL.SERVICE_ID = F_SERVICE_NAME.ID
--Operation name to join to F_SERVICE_LOGSTATUS table
INNER JOIN LOGUSR.F_SERVICE_OPERATION_NAME
ON ORIGINAL.OPERATION_ID = F_SERVICE_OPERATION_NAME.ID
--Archive strategy
INNER JOIN LOGUSR.F_SERVICE_LOGSTATUS
ON F_SERVICE_NAME.SERVICE_NAME = F_SERVICE_LOGSTATUS.SERVICE_NAME
AND F_SERVICE_OPERATION_NAME.OPERATION_NAME = F_SERVICE_LOGSTATUS.OPERATION_NAME
WHERE F_SERVICE_LOGSTATUS.ARCHIVE_FLAG = 'Y'
AND F_SERVICE_LOGSTATUS.ARCHIVE_DAYS <= (sysdate-EXCEPTION_DATE.EXCEPTION_DATE);
SNIP
END LOG_ARCHIVE;
END F_LOG_ARCHIVE_PKG;
返回错误:
错误(4,5):PL / SQL:忽略SQL语句 错误(4,24):PL / SQL:ORA-00942:表或视图不存在
DBA最近更新为角色,为用户提供对两个模式的写访问权。
答案 0 :(得分:0)
您的包引用两个模式中的表,LOGUSR和LOGARC。当我们构建一个包时,我们只能引用模式中的对象(包所有者)和其他模式中的对象,其中权限已被授予我们直接。通过角色授予的权限对此无益(因为Oracle安全模型)。
你说,
“DBA最近更新为角色,为用户提供对两个模式的写入权限。”
因此,根据您的程序包拥有哪个架构,您需要让DBA授予您对其他架构对象的权限。