0

我有一个表,它有一个 StartDate 和 EndDate 字段,还有很多其他字段。我需要在 StartDate 和 EndDate 之间的所有天数内将每条记录拆分到另一个表中,该表看起来与原始表完全相同,只是它有一个 CurrentDate 字段和 2 个计算字段。CurrentDate 字段是我正在交互的 StartDate 和 EndDate 之间的当前日期。

我的问题是,由于其中有大量字段,是否有任何简单的方法可以从我的存储过程中插入光标当前所在的整行和这 1 个新列,而不必列出其中的每一行插入语句?这太乏味了。

4

2 回答 2

0

如果您的源表和目标表符合此配置文件:

  1. 目标表的列与源表的列相同,并且
  2. 新的目标列位于末尾

...然后你可以做这样的事情:

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. 同样,这没有经过测试,但如果您认为它很有希望并且难以实施,我很乐意对其进行测试。

于 2013-05-03T19:07:24.990 回答
0

在单个 SQL 语句中加密数据很容易。假设您知道和的合理最小和最大范围begin_dateend_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)

如果您不想硬编码开始日期和结束日期,也可以从表中获取它们。这只需要你第二次上桌,这通常会降低效率。

于 2013-05-03T19:41:18.243 回答