ainibababpk 2015-05-03 16:04 采纳率: 0%
浏览 605

我想问问,我这么写触发器,对不对,求大神解答

从来没有写过触发器,然后毕设需要,不知道写对了没,这是我建的表,要完成的功能是,当插入数据时,执行这个触发器,即循环插入数据,其中curr_time字段是时间类型,并且按照createdby1自增长方式增加,其中week_num字段从1一直循环到总共周数(count_week)

 create table F_FT_TIME  (
   ROW_ID               NUMBER(18)                      not null,
   CURR_TIME            DATE,
   START_DATE           DATE,
   STOP_DATE            DATE,
   START_YEAR           VARCHAR2(4),
   STOP_YEAR            VARCHAR2(4),
   START_MON            VARCHAR2(2),
   STOP_MON             VARCHAR2(2),
   COUNT_WEEK           CHAR(10),
   WEEK_NUM             VARCHAR2(2),
   WEEK                 VARCHAR2(1),
   LESSON               VARCHAR2(2),
   START_TIME           DATE,
   STOP_TIME            DATE,
   COURSE_ID            NUMBER(18),
   constraint PK_F_FT_TIME primary key (ROW_ID)
)

图片说明

下面是我写的触发器

 create trigger biufer_F_FT_TIME
after insert
on F_FT_TIME
referencing old as old_value 
new as new_value
declare
 i number;
 k number;
 j number;
begin
for i in new_value.count_week loop
    for k in 7 loop
        for j in 13 loop
            insert into F_FT_TIME(
                curr_time,
                start_date,
                stop_date,
                start_year,
                stop_year,
                start_mon,
                stop_mon,
                count_week,
                week_num,
                week,
                lesson
            ) values(
                new_value.curr_time+(interval createby1.nextval day),
                new_value.start_date,
                new_value.stop_date,
                new_value.start_year,
                new_value.stop_year,
                new_value.start_mon,
                new_value.stop_mon,
                new_value.count_week,
                i,
                k,
                j
            );
        end loop;
    end loop;
end loop;
end;

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 19:12
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    您的触发器设计看起来正确。以下是对您所描述功能的一个示例:

    CREATE OR REPLACE TRIGGER biufer_F_FT_TIME
    AFTER INSERT ON F_FT_TIME
    FOR EACH ROW
    DECLARE
        i NUMBER := NEW.count_week; -- 变量用于存储计数
    BEGIN
        FOR j IN 1..NEW.week LOOP
            FOR k IN 1..NEW.week_num LOOP
                INSERT INTO F_FT_TIME(
                    curr_time,
                    start_date,
                    stop_date,
                    start_year,
                    stop_year,
                    start_mon,
                    stop_mon,
                    count_week,
                    week_num,
                    week,
                    lesson
                )
                VALUES(
                    NEW.curr_time + INTERVAL NEW.createby1.nextval DAY,
                    NEW.start_date,
                    NEW.stop_date,
                    NEW.start_year,
                    NEW.stop_year,
                    NEW.start_mon,
                    NEW.stop_mon,
                    i,
                    k,
                    j,
                    'L'
                );
            END LOOP;
        END LOOP;
    END;
    /
    

    这段脚本将根据createby1.nextval递增值来填充F_FT_TIME表中的行。请注意,这里的NEXTVAL表示在Oracle中用于获取下一个序列值的函数。

    确保您已经设置了正确的数据库连接,并且F_FT_TIME表已正确创建。此外,确保createby1列具有有效的递增行为,以确保每次更新后,count_weekweek_num字段按预期递增。如果您没有设置nextval,则可能无法实现预期的行为。

    如果需要进一步的帮助,请提供更具体的问题或错误消息,以便我能更好地指导您。

    评论

报告相同问题?