周末插入或更新列

时间:2012-05-07 17:13:03

标签: oracle plsql

declare
  str varchar2(4000);
  i int;
begin
  for i in 1 ..31 loop

    str:= str || 'col' || i || ' varchar2(2)';
    if i < 31 then
       str := str || ',';
    end if;
  end loop;
  execute immediate 'create table t1  ('|| str ||')';
end;
/

我是pl / sql中的新手 此过程创建包含31列的t1表。 31是月中的某一天(比如五月)。我无法创建具有以下条件的过程: 如果col(i)i in(&#39; Sat&#39;,&#39; Sun&#39;)... 插入t1值(&#39; r&#39;) 例如,此程序必须插入&#39; r&#39;到col5,col6,col12,col13 ..列 因为太阳或周六的5月,6日,12日,13日

 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;  
 /

我试过这个程序,但有几个错误 我必须在哪里纠正我的错误 提前谢谢

2 个答案:

答案 0 :(得分:3)

我同意with Bob Jarvis您应该拥有更好的数据模型。但只是为了咧嘴笑,我们假设你必须使用你所拥有的东西。

此过程需要一个月和一年作为参数,并从中生成一系列天数。我给了MON_T表两列,MON和YR作为主键,因为我无法帮助自己。

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;

答案 1 :(得分:2)

我建议您阅读data normalization的规则。该表似乎存在一个主要问题,即它具有所谓的“重复组” - 在这种情况下,31个字段用于每天的信息。您可能需要一个表格,其中包含您感兴趣的完整日期,然后是描述该日期的字段。也许类似于以下内容:

CREATE TABLE CALENDAR_DAY
  (CAL_DATE         DATE PRIMARY KEY,
   COL              NUMBER,
   <definitions of other fields needed for each day>);

鉴于上述情况,您的代码变为

 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;  

希望这会给你一些想法。

分享并享受。