我有一个包含StartDate和EndDate字段的表,还有很多其他字段。我需要在包括StartDate&在内的所有日子之前打破每条记录。 EndDate到另一个看起来与原始表完全相同的表,除了它有一个CurrentDate字段和2个计算字段。 CurrentDate字段是我正在进行的StartDate和EndDate之间的当前日期。
我的问题是,由于这里有很多字段,在我的存储过程中是否有任何简单的方法,插入光标当前所在的整行和这1个新列,而不必列出每一个insert语句中的单行?这太乏味了。
答案 0 :(得分:0)
如果您的源表和目标表符合此配置文件:
...然后你可以这样做:
INSERT INTO dest_table
SELECT Source_Table.*, new_value
FROM Source_Table
WHERE Source_Table.PKValue = cursor.PKValue
如果您的光标与目标表格相似,那么可能会工作,但请注意我没有对其进行测试:
CREATE PROCEDURE whatever IS
destRow dest_table%ROWTYPE;
CURSOR fromSourceTable IS
SELECT <your existing select list>, NULL AS new_value
FROM <the rest of your cursor query>;
BEGIN
FOR destRow IN fromSourceTable LOOP
destRow.new_value = <the split date>;
INSERT INTO dest_table VALUES destRow;
END LOOP;
END whatever;
我正带着NULL AS new_value
走出去。如果您遇到问题,请尝试使用CAST(NULL AS DATE) AS new_value
,如果仍然遇到问题,请尝试SYSDATE AS new_value
。再次,这没有经过测试,但如果您认为它很有前途且无法实施,我很乐意对其进行测试。
答案 1 :(得分:0)
在单个SQL语句中简化数据是很容易的。假设您知道begin_date
和end_date
的合理最小和最大范围(我假设2000年1月1日 - 2020年12月31日,但您可以明显调整它)
WITH all_days AS (
SELECT date '2000-01-01' + level dt
FROM dual
CONNECT BY level <= date '2020-12-31' - date '2000-01-01'
)
SELECT <<list of colums from your table>>,
all_days.dt current_date
FROM your_table actual
JOIN all_days ON (actual.begin_date <= all_days.dt AND
actual.end_date >= all_days.dt)
如果您不想对开始和结束日期进行硬编码,也可以从表中获取它们。这只需要你第二次上桌,这通常会降低效率。