我对Perl编程语言非常不熟悉,并且被赋予了用运行总数和列DEBIT和CREDIT的总和填充Oracle SQL表的任务。当我尝试加载测试文件csv时,运行的total和sum列没有正确加载。
我尝试创建一个子例程来填充运行的total和sum_of_debit credit列:
sub running total
{
my $sql=<<UPDATESQL;
UPDATE liq.ecb_stat s
SET sum_of_debit_credit= debit-credit
WHERE s.sum_of_debit_credit IS NULL
;
UPDATE liq.ecb_stat s
SET running_total= {SELECT SUM(sum_of_debit_credit) OVER(ORDER BY settlement_time_stamp)
FROM liq.ecb_stat s2
WHERE s.settlement_time_stamp=s2.settlement_time_stamp)
where s.running_total IS NULL
UPDATESQL
}
理想情况下,这应该返回正确的值,但到目前为止还没有。
1条答案
按热度按时间tzcvj98z1#
您的SQL无效(我们不使用
{ }
,而是使用( )
进行子查询,并且OVER
子句将返回多行,这违反了=
表达式中的子查询必须仅返回一行的规则,所以我知道您尚未实际执行这些更新。如果您遇到Perl问题,其他人可以帮助您解决这个问题,使您能够真正向数据库发送调用。但是一旦你弄清楚了,你还需要解决坏的SQL,这是一个Oracle的问题。
要获得运行总数,您必须在聚合中使用
ROWS BETWEEN
窗口,并且要获得合理的性能,您根本不应该在SET
子句的子查询中尝试这样做。你最好使用MERGE
,像这样:您也可以将这两个操作合并为一个: