Oracle程序包正文编译错误:SQL语句忽略,表或视图不存在

时间:2017-12-06 00:50:26

标签: plsql oracle12c

我需要将我写入的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最近更新为角色,为用户提供对两个模式的写访问权。

1 个答案:

答案 0 :(得分:0)

您的包引用两个模式中的表,LOGUSR和LOGARC。当我们构建一个包时,我们只能引用模式中的对象(包所有者)和其他模式中的对象,其中权限已被授予我们直接。通过角色授予的权限对此无益(因为Oracle安全模型)。

你说,

  

“DBA最近更新为角色,为用户提供对两个模式的写入权限。”

因此,根据您的程序包拥有哪个架构,您需要让DBA授予您对其他架构对象的权限。