我正在尝试使用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;
/
答案 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;
/