尝试从现在起186天后每天创建一个循环

时间:2018-03-30 15:33:51

标签: oracle plsql

我正在尝试使用for循环在接下来的186天内每天为2个不同的ID自动生成一个新的调查周期。我不确定PL / SQL是否允许这样做,但是当我在下面运行我的代码时;我收到一个错误,即我的变量(' X')不能用作分配目标。我需要使用变量' X'添加到我的sysdate以自动增加我的日期1天。有一个更好的方法吗?我的代码/尝试如下:

Create or Replace Procedure Cycle AS
BEGIN
declare
    x number;
begin
    x := 0;
    for x in 1..186 loop
        insert into cycle ( form_id, create_dt, create_user_id, modify_dt, modify_user_id, effective_dt, inactive_dt,  reporting_month, open_dt, close_dt)
                      values ( 777, sysdate +  x,  null, null, null, null, null,   to_char(sysdate, 'Mon'), trunc(sysdate), trunc(sysdate + 1));
        insert into cycle ( form_id, create_dt, create_user_id, modify_dt, modify_user_id, effective_dt, inactive_dt, cycle_Tx, reporting_month, open_dt, close_dt)
                      values ( 776, sysdate +  x,  null, null, null, null, null,   to_char(sysdate, 'Mon'), trunc(sysdate), trunc(sysdate + 1));
        x := x + 1;
      end loop;
    commit;
end;
END Cycle;
    /

2 个答案:

答案 0 :(得分:2)

不需要PL / SQL,只需使用CONNECT BY LEVEL和纯SQL INSERT。您的块实际上会导致过多的上下文切换。

INSERT INTO CYCLE
            (form_id,
             create_dt,
             create_user_id,
             modify_dt,
             modify_user_id,
             effective_dt,
             inactive_dt,
             reporting_month,
             open_dt,
             close_dt)
SELECT 777,
       SYSDATE + LEVEL,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL,
       TO_CHAR(SYSDATE, 'Mon'),
       TRUNC(SYSDATE),
       TRUNC(SYSDATE + 1)
FROM   dual
CONNECT BY LEVEL <= 186;

INSERT INTO CYCLE
            (form_id,
             create_dt,
             create_user_id,
             modify_dt,
             modify_user_id,
             effective_dt,
             inactive_dt,
             reporting_month,
             open_dt,
             close_dt)
SELECT 776,
       SYSDATE + LEVEL,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL,
       TO_CHAR(SYSDATE, 'Mon'),
       TRUNC(SYSDATE),
       TRUNC(SYSDATE + 1)
FROM   dual
CONNECT BY LEVEL <= 186;

COMMIT;  

答案 1 :(得分:1)

删除:x:= x + 1;就像在for循环中一样,它会自己做。

Create or Replace Procedure Cycle AS
BEGIN
declare
    x number;
begin
    for x in 1..186 loop
        insert into cycle ( form_id, create_dt, create_user_id, modify_dt, modify_user_id, effective_dt, inactive_dt,  reporting_month, open_dt, close_dt)
                      values ( 777, sysdate +  x,  null, null, null, null, null,   to_char(sysdate, 'Mon'), trunc(sysdate), trunc(sysdate + 1));
        insert into cycle ( form_id, create_dt, create_user_id, modify_dt, modify_user_id, effective_dt, inactive_dt, cycle_Tx, reporting_month, open_dt, close_dt)
                      values ( 776, sysdate +  x,  null, null, null, null, null,   to_char(sysdate, 'Mon'), trunc(sysdate), trunc(sysdate + 1));

   DBMS_OUTPUT.PUT_LINE('Count: ' || x1);

      end loop;
    commit;
end;
END Cycle;
/