oracle sql突破记录

时间:2013-05-03 18:48:37

标签: oracle plsql

我有一个包含StartDate和EndDate字段的表,还有很多其他字段。我需要在包括StartDate&在内的所有日子之前打破每条记录。 EndDate到另一个看起来与原始表完全相同的表,除了它有一个CurrentDate字段和2个计算字段。 CurrentDate字段是我正在进行的StartDate和EndDate之间的当前日期。

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

2 个答案:

答案 0 :(得分:0)

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

  1. 目标表列与源表的列相同,
  2. 新目标列位于最后
  3. ...然后你可以这样做:

    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_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)

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