Oracle函数返回表结果合并:获取近3天数据的正确语法求助
问题分析与解决方案
首先,我得先指出你修改后的脚本里几个明显的错误:
1. 函数名拼写错误
你写了result2 := funct(today_2);,这里的funct应该是func(和前面的调用保持一致),拼写错误会直接导致编译失败。
2. 对UNION的误用
UNION是SQL中用来合并多个查询结果集的关键字,不能用来合并PL/SQL的数值变量。你的result_final是number类型,而union的用法完全不符合PL/SQL语法,这是核心错误。
结合你提供的存储过程,明确需求逻辑
从你给出的FILLTABLE存储过程来看,这个过程的作用是传入日期后,调用GETTRAILERSSHIPPED获取游标,再循环调用GETSHIPMENTDATA填充数据到目标表(推测)。你的func(today)应该是封装了类似FILLTABLE的逻辑——传入日期后处理当天的数据并写入表中。
所以你的需求应该是:执行近3天的填充逻辑,把这3天的数据都写入到目标表中,而不是把数值合并到单个变量里。
正确的PL/SQL脚本
如果是这个需求,你不需要用union,只需要连续调用3次对应的函数/存储过程即可:
DECLARE today VARCHAR(10) := TO_CHAR(SYSDATE, 'YYYYMMDD'); today_1 VARCHAR(10) := TO_CHAR(SYSDATE - 1, 'YYYYMMDD'); today_2 VARCHAR(10) := TO_CHAR(SYSDATE - 2, 'YYYYMMDD'); BEGIN -- 调用今天的逻辑 func(today); -- 调用昨天的逻辑 func(today_1); -- 调用前天的逻辑(修正了函数名拼写) func(today_2); -- 如果你需要统计这3天处理的总条数(假设func返回处理行数),可以这样写: -- DECLARE -- cnt_today NUMBER; -- cnt_yesterday NUMBER; -- cnt_daybefore NUMBER; -- total_cnt NUMBER; -- BEGIN -- cnt_today := func(today); -- cnt_yesterday := func(today_1); -- cnt_daybefore := func(today_2); -- total_cnt := cnt_today + cnt_yesterday + cnt_daybefore; -- DBMS_OUTPUT.PUT_LINE('总处理条数:' || total_cnt); -- END; END; /
额外说明
如果你的func其实就是调用FILLTABLE存储过程,那脚本应该改成存储过程的调用语法(存储过程不能用赋值语句,直接执行即可):
DECLARE today VARCHAR(10) := TO_CHAR(SYSDATE, 'YYYYMMDD'); today_1 VARCHAR(10) := TO_CHAR(SYSDATE - 1, 'YYYYMMDD'); today_2 VARCHAR(10) := TO_CHAR(SYSDATE - 2, 'YYYYMMDD'); BEGIN FILLTABLE(today); FILLTABLE(today_1); FILLTABLE(today_2); END; /
这样就能正确执行近3天的数据填充逻辑了。
内容的提问来源于stack exchange,提问作者Pardeep Naik
相关产品推荐
相关产品推荐

