Oracle 根据需要插入或更新列

Oracle 根据需要插入或更新列,oracle,plsql,Oracle,Plsql,我尝试过这个过程,但有几个错误 我应该在哪里改正我的错误 提前谢谢我建议你仔细阅读一下游戏规则。该表似乎存在一个主要问题,即它有所谓的“重复组”——在本例中,31个字段用于显示每天的信息。您可能需要一个包含您感兴趣的完整日期的表,然后是描述该日期的字段。也许是这样的: BEGIN FOR i IN 1..31 LOOP IF( to_char(sysdate-1+i,'DAY') IN ('SAT', 'SUN') ) THEN INSERT I

我尝试过这个过程,但有几个错误 我应该在哪里改正我的错误
提前谢谢

我建议你仔细阅读一下游戏规则。该表似乎存在一个主要问题,即它有所谓的“重复组”——在本例中,31个字段用于显示每天的信息。您可能需要一个包含您感兴趣的完整日期的表,然后是描述该日期的字段。也许是这样的:

 BEGIN   
   FOR i IN 1..31 LOOP
     IF( to_char(sysdate-1+i,'DAY')  IN ('SAT', 'SUN') )
     THEN
       INSERT INTO t1 (col(i))
         VALUES ('r');
     END IF;   
   END LOOP;  
 END;  
 /
希望这能给你一些想法


分享和享受。

我建议你仔细阅读生活规则。该表似乎存在一个主要问题,即它有所谓的“重复组”——在本例中,31个字段用于显示每天的信息。您可能需要一个包含您感兴趣的完整日期的表,然后是描述该日期的字段。也许是这样的:

 BEGIN   
   FOR i IN 1..31 LOOP
     IF( to_char(sysdate-1+i,'DAY')  IN ('SAT', 'SUN') )
     THEN
       INSERT INTO t1 (col(i))
         VALUES ('r');
     END IF;   
   END LOOP;  
 END;  
 /
希望这能给你一些想法

分享和享受。

我同意你应该有一个更好的数据模型。但是,仅仅为了露齿而笑,让我们假设你必须用你所拥有的来工作

此过程将月份和年份作为参数,并从中生成一系列天数。我已经给了MON_T表两列,MON和YR作为主键,因为我无法控制自己

 DECLARE
   dtMonth_of_interest  DATE := TRUNC(SYSDATE, 'MONTH');
 BEGIN   
   FOR i IN 0..30 LOOP
     IF( to_char(dtMonth_of_interest+i,'DAY')  IN ('SAT', 'SUN') )
     THEN
       INSERT INTO CALENDAR_DAY (CAL_DATE, COL)
         VALUES (dtMonth_of_interest + i, 'r');
     END IF;   
   END LOOP;  
 END;  
我同意你应该有一个更好的数据模型。但是,仅仅为了露齿而笑,让我们假设你必须用你所拥有的来工作

此过程将月份和年份作为参数,并从中生成一系列天数。我已经给了MON_T表两列,MON和YR作为主键,因为我无法控制自己

 DECLARE
   dtMonth_of_interest  DATE := TRUNC(SYSDATE, 'MONTH');
 BEGIN   
   FOR i IN 0..30 LOOP
     IF( to_char(dtMonth_of_interest+i,'DAY')  IN ('SAT', 'SUN') )
     THEN
       INSERT INTO CALENDAR_DAY (CAL_DATE, COL)
         VALUES (dtMonth_of_interest + i, 'r');
     END IF;   
   END LOOP;  
 END;  

您的表有31列(每天一列?),为什么?我同意@SérgioMichels的观点,我会检查一下您的表结构,通常情况下,日期以行的形式存储在表中,然后在表示层中,您可以将数据(如果需要)旋转到列中。将日期作为列暗示存在设计问题。感谢您的评论,但希望为我们的部门创建工作时间表,因此我希望该过程自动确定周末并插入“r”值。嗯,工作时间表有一个包含数据的字段,对吗?然后,您需要另一列来标记它是否是工作日。不需要31栏。你将如何处理2月31日?你应该正常化这个表。你有一个31列的表(每天一列?),为什么?我同意@SérgioMichels的观点,我会检查一下您的表结构,通常情况下,日期以行的形式存储在表中,然后在表示层中,您可以将数据(如果需要)旋转到列中。将日期作为列暗示存在设计问题。感谢您的评论,但希望为我们的部门创建工作时间表,因此我希望该过程自动确定周末并插入“r”值。嗯,工作时间表有一个包含数据的字段,对吗?然后,您需要另一列来标记它是否是工作日。不需要31栏。你将如何处理2月31日?你应该使这张桌子正常化。
create or replace procedure gen_month_rec 
     ( p_mon in mon_t.mon%type
       ,  p_yr in mon_t.yr%type )
is
    lrec mon_t%rowtype;
    empty_rec mon_t%rowtype;
    first_dt date;
    last_d pls_integer;
begin
    lrec := empty_rec;
    lrec.mon := p_mon;
    lrec.yr := p_yr;

    first_dt := to_date('01-'||p_mon||'-'||p_yr, 'dd-mon-yyyy');
    last_d := to_number(to_char(last_day(first_dt),'dd'));

    for i in 1 .. last_d 
    loop
        if to_char(first_dt-+ (i-1),'DAY') in ('SAT', 'SUN') 
        then
            execute immediate 'begin lrec.col'
                                   ||trim(to_char(i))
                                   ||' := ''r''; end;';
        end if;
    end loop;

    insert into mon_t values lrec;
end;