【问题标题】:PL/SQL: SQL Statement ignored, PL/SQL: ORA-00942: table or view does not existPL/SQL: SQL 语句被忽略,PL/SQL: ORA-00942: 表或视图不存在
【发布时间】:2022-01-23 13:16:37
【问题描述】:

我用包的主体创建了一个包。包本身已编译,但主体没有。表已创建,字段存在,类型正确。但它给出了一个错误 32/5 PL / SQL:SQL 语句被忽略 49/17 PL / SQL:ORA-00942:表或视图不存在 帮助解决问题。

 create or replace package dma.fill_account_turnover_f is
  ----------------------------------------------------------------------------------------------------

  c_MartName                       constant varchar2(30 char) := 'dma.DM_ACCOUNT_TURNOVER_F';

  ----------------------------------------------------------------------------------------------------
  /**  –асчет оборотов по счетам за дату
   *   i_OnDate - дата расчета
   */
  procedure fill
  ( i_OnDate                       in date
  );
  ----------------------------------------------------------------------------------------------------

end fill_account_turnover_f;
/
create or replace package body dma.fill_account_turnover_f is
 ----------------------------------------------------------------------------------------------------
  procedure Log
  ( i_message                      in varchar2
  ) 
  is
  begin
    dma.logger.writeLog('[' || c_MartName || '] ' || i_message);
  end;
  ----------------------------------------------------------------------------------------------------

  ----------------------------------------------------------------------------------------------------
  procedure fill
  ( i_OnDate                       in date
  )
  is
  begin

    Log( '[BEGIN] fill(i_OnDate => date ''' 
         || to_char(i_OnDate, 'yyyy-mm-dd') 
         || ''');'
       );
    
    Log( 'delete on_date = ' 
         || to_char(i_OnDate, 'yyyy-mm-dd')
       );
    delete
      from dma.dm_account_turnover_f f
     where f.on_date = i_OnDate;
   
    Log('insert');
    insert
      into dma.dm_account_turnover_f
           ( on_date
           , account_rk
           , credit_amount
           , credit_amount_rub
           , debet_amount
           , debet_amount_rub
           )
    with wt_turn as
    ( select p.credit_account_rk                  as account_rk
           , p.credit_amount                      as credit_amount
           , p.credit_amount 
             * nvl(er.reduced_cource, 1)          as credit_amount_rub
           , cast(null as number)                 as debet_amount
           , cast(null as number)                 as debet_amount_rub
        from ds.ft_posting_f p
        join ds.md_account_d a
          on a.account_rk = p.credit_account_rk
        left
        join ds.md_exchange_rate_d er
          on er.currency_rk = a.currency_rk
         and i_OnDate between er.data_actual_date   and er.data_actual_end_date
       where p.oper_date = i_OnDate
         and i_OnDate           between a.data_actual_date    and a.data_actual_end_date
         and a.data_actual_date between trunc(i_OnDate, 'mm') and last_day(i_OnDate)
       union all
      select p.debet_account_rk                   as account_rk
           , cast(null as number)                 as credit_amount
           , cast(null as number)                 as credit_amount_rub
           , p.debet_amount                       as debet_amount
           , p.debet_amount 
             * nvl(er.reduced_cource, 1)          as debet_amount_rub
        from ds.ft_posting_f p
        join ds.md_account_d a
          on a.account_rk = p.debet_account_rk
        left 
        join ds.md_exchange_rate_d er
          on er.currency_rk = a.currency_rk
         and i_OnDate between er.data_actual_date and er.data_actual_end_date
       where p.oper_date = i_OnDate
         and i_OnDate           between a.data_actual_date and a.data_actual_end_date
         and a.data_actual_date between trunc(i_OnDate, 'mm') and last_day(i_OnDate)
    )
    select i_OnDate                               as on_date
         , t.account_rk
         , sum(t.credit_amount)                   as credit_amount
         , sum(t.credit_amount_rub)               as credit_amount_rub
         , sum(t.debet_amount)                    as debet_amount
         , sum(t.debet_amount_rub)                as debet_amount_rub
      from wt_turn t
     group by t.account_rk;

     Log('[END] inserted ' || to_char(sql%rowcount) || ' rows.');

    commit;
    
  end;
  ----------------------------------------------------------------------------------------------------

end fill_account_turnover_f;
/ ```

【问题讨论】:

  • 错误消息中的行号显示了它为哪个表提供了错误。这可能是你遇到this 问题
  • 第 49 行指的是ds.md_account_d。该包似乎属于 DMA,因此可能 DS 需要将 MD_ACCOUNT_D 的 READ 权限授予 DMA。您对使用多模式系统表示同情,因为设计在 Powerpoint 中可能看起来很棒,但在我的经验中它们只会带来无穷无尽的问题。
  • @WilliamRobertson 你是对的。非常感谢您的帮助!
  • 不客气。我已将其添加为答案。

标签: oracle plsql


【解决方案1】:

第 49 行引用 ds.md_account_d。该包属于DMA,所以可能DS需要

grant READ on MD_ACCOUNT_D to DMA;

以及所需的任何其他权限。

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2012-02-10
    相关资源
    最近更新 更多