請告訴我如何在處理當前表時參考該列。我需要對已經計算過的欄位進行計算,通過化名參考表欄位無濟于事,也許我錯過了其他東西,但如果有人向我指出我的愚蠢,我會很高興。我在一個簡單的地方看不到解決方案:(
非常感謝!
問題出在這個地方PLS-00225: subprogram or cursor 'F' reference is out of scope:
then f.balance_in_rub - f.turn_cre_rub f.turn_deb_rub
本體包:
create or replace package body dma.fill_f101_round_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_F101_ROUND_F f
where trunc(i_OnDate, 'mm') = from_date
and last_day(i_OnDate) = to_date;
Log('insert');
insert
into dma.dm_f101_round_f f
( from_date
, to_date
, chapter
, ledger_account
, characteristic
, balance_in_rub
, balance_in_val
, balance_in_total
, turn_deb_rub
, turn_deb_val
, turn_deb_total
, turn_cre_rub
, turn_cre_val
, turn_cre_total
, balance_out_rub
, balance_out_val
, balance_out_total
)
select trunc(i_OnDate, 'mm') as from_date,
last_day(i_OnDate) as to_date,
s.chapter as chapter,
substr(acc_d.account_number, 1, 5) as ledger_account,
acc_d.char_type as characteristic,
-- RUB balance
sum( case
when cur.currency_code in ('643', '810')
then b.balance_out
else 0
end
) as balance_in_rub,
-- VAL balance converted to rub
sum( case
when cur.currency_code not in ('643', '810')
then b.balance_out * exch_r.reduced_cource
else 0
end
) as balance_in_val,
-- Total: RUB balance VAL converted to rub
sum( case
when cur.currency_code in ('643', '810')
then b.balance_out
else b.balance_out * exch_r.reduced_cource
end
) as balance_in_total ,
-- RUB debet turnover
sum(case
when cur.currency_code in ('643', '810')
then at.debet_amount_rub
else 0
end
) as turn_deb_rub,
-- VAL debet turnover converted
sum(case
when cur.currency_code not in ('643', '810')
then at.debet_amount_rub
else 0
end
) as turn_deb_val,
-- SUM = RUB debet turnover VAL debet turnover converted
sum(at.debet_amount_rub) as turn_deb_total,
-- RUB credit turnover
sum(case
when cur.currency_code in ('643', '810')
then at.credit_amount_rub
else 0
end
) as turn_cre_rub,
-- VAL credit turnover converted
sum(case
when cur.currency_code not in ('643', '810')
then at.credit_amount_rub
else 0
end
) as turn_cre_val,
-- SUM = RUB credit turnover VAL credit turnover converted
sum(at.credit_amount_rub) as turn_cre_total,
sum( case
when cur.currency_code in ('643','810') and acc_d.char_type = 'A'
then f.balance_in_rub - f.turn_cre_rub f.turn_deb_rub
when cur.currency_code in ('643','810') and acc_d.char_type = 'P'
then f.balance_in_rub - f.turn_cre_rub f.turn_deb_rub
else 0
end
) as balance_out_rub,
sum( case
when cur.currency_code not in ('643', '810') and acc_d.char_type = 'A'
then f.balance_in_val - f.turn_cre_val f.turn_deb_val
when cur.currency_code not in ('643', '810') and acc_d.char_type = 'P'
then f.balance_in_val f.turn_cre_val - f.turn_deb_val
else 0
end
) as balance_out_val,
sum (f.balance_out_val f.balance_out_rub) as balance_out_total
from ds.md_ledger_account_s s
join ds.md_account_d acc_d
on substr(acc_d.account_number, 1, 5) = s.ledger_account
join ds.md_currency_d cur
on cur.currency_rk = acc_d.currency_rk
left
join ds.ft_balance_f b
on b.account_rk = acc_d.account_rk
and b.on_date = trunc(i_OnDate, 'mm') - 1
left
join ds.md_exchange_rate_d exch_r
on exch_r.currency_rk = acc_d.currency_rk
and i_OnDate between exch_r.data_actual_date and exch_r.data_actual_end_date
left
join dma.dm_account_turnover_f at
on at.account_rk = acc_d.account_rk
and at.on_date between trunc(i_OnDate, 'mm') and last_day(i_Ondate)
where i_OnDate between s.start_date and s.end_date
and i_OnDate between acc_d.data_actual_date and acc_d.data_actual_end_date
and i_OnDate between cur.data_actual_date and cur.data_actual_end_date
group by s.chapter,
substr(acc_d.account_number, 1, 5),
acc_d.char_type;
Log('[END] inserted ' || to_char(sql%rowcount) || ' rows.');
commit;
end;
----------------------------------------------------------------------------------------------------
end fill_f101_round_f;
/ ```
uj5u.com熱心網友回復:
這是f:
into dma.dm_f101_round_f f
^
here it is
f.balance_in_rub是這樣的:
-- RUB balance
sum( case
when cur.currency_code in ('643', '810')
then b.balance_out
else 0
end
) as balance_in_rub,
--------------
here it is
您不能僅通過命名來參考正在插入的列;在這方面是未知的。如果你想執行一些計算,你必須用“源”本身來做,即
then f.balance_in_rub - f.turn_cre_rub f.turn_deb_rub
會成為
then
sum(case
when cur.currency_code in ('643', '810')
then b.balance_out
else 0
end
) -
sum(case
when cur.currency_code in ('643', '810')
then at.credit_amount_rub
else 0
end
)
sum(case
when cur.currency_code in ('643', '810')
then at.debet_amount_rub
else 0
end
)
即你會重用所有的代碼。不太漂亮,恐怕。
另一種選擇是先做insert,update然后再做
update dm_f101_round_f f set
f.balance_out_rub = f.balance_in_rub - f.turn_cre_rub f.turn_deb_rub
where ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/391954.html
