0
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 は月の日 (たとえば 5 月) です。このような条件を持つプロシージャを作成できません: if col(i) i in ('Sat','Sun') ... insert into t1 value ('r') たとえば、このプロシージャは 'r を挿入する必要があります' col5,col6,col12,col13 .. 5 月 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;  
 /

この手順を試してみましたが、間違いを修正しなければならないエラーがいくつかあります 事前に感謝します

4

2 に答える 2

4

より良いデータモデルが必要であるというBobJarvis同意します。しかし、ニヤリとだけのために、あなたが持っているもので作業しなければならないと仮定しましょう。

この手順では、パラメータとして月と年を取り、それらから日数の範囲を生成します。MON_TテーブルにMONとYRの2つの列を主キーとして指定しました。これは、自分自身を助けることができないためです。

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;
于 2012-05-08T07:01:15.377 に答える
2

データの正規化のルールをよく読んでおくことをお勧めします。このテーブルには、「繰り返しグループ」と呼ばれるものが含まれているという大きな問題があるようです。この場合、各日に関する情報のための 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;  

うまくいけば、これでいくつかのアイデアが得られます。

共有してお楽しみください。

于 2012-05-08T01:58:54.127 に答える