Loops Oracle PL/SQL循环问题
嘿,伙计们,尝试使用循环来循环几天,这样我的脚本就不会失败循环每次都无法执行我不确定我做错了什么,但是我知道事实上select语句是好的,它只是我遇到麻烦的循环,也可以让循环检查表中的最大日期只删除最长的日期吗如果数据不完整,则只添加到日期所需的内容 错误行41,第4列: PL/SQL:ORA-00933:SQL命令未正确结束 ORA-06550:第7m行第1列: 忽略Pl/sql语句Loops Oracle PL/SQL循环问题,loops,plsql,Loops,Plsql,嘿,伙计们,尝试使用循环来循环几天,这样我的脚本就不会失败循环每次都无法执行我不确定我做错了什么,但是我知道事实上select语句是好的,它只是我遇到麻烦的循环,也可以让循环检查表中的最大日期只删除最长的日期吗如果数据不完整,则只添加到日期所需的内容 错误行41,第4列: PL/SQL:ORA-00933:SQL命令未正确结束 ORA-06550:第7m行第1列: 忽略Pl/sql语句 delete Target_table commit; DECLARE i_date date; B
delete Target_table
commit;
DECLARE
i_date date;
BEGIN
i_date := '01-Jan-2014';
WHILE i_date < sysdate LOOP
insert into Target_table
Select field_1,
field_2
From Data_table_1
LEFT JOIN Data_table_2
ON Data_table_1.ACCOUNT_ID=Data_table_2.account_id
Where Data_table_1.Date >= i_date
and Data_table_1.Date < i_date+1
and Data_table_1.COST_CENTRE In ('1','2','3','4','5','6','7','8','9','10')
And Data_table_1.field_3 In ('C', 'D')
And Data_table_1.field_4 Is Null
And Data_table_2.field_5 in (1,2)
END;
commit;
i_date := i_date +1;
END LOOP;
END
我对你的代码做了一些修改。我认为这应该行得通。我还提到了我已作出修改的评论
DECLARE
i_date DATE;
BEGIN
DELETE Target_table; -- Inserted inside the Anonymous block
i_date := to_date('10-Nov-2015','DD-MON-YYYY'); -- Specified Date format
WHILE i_date < sysdate
LOOP
INSERT INTO Target_table
SELECT field_1,
field_2
FROM Data_table_1
LEFT JOIN Data_table_2
ON Data_table_1.ACCOUNT_ID =Data_table_2.account_id
WHERE Data_table_1.Date_field1 >= i_date
AND Data_table_1.Date_field1 < i_date+1
AND Data_table_1.COST_CENTRE IN ('1','2','3','4','5','6','7','8','9','10')
AND Data_table_1.field_3 IN ('C', 'D')
AND Data_table_1.field_4 IS NULL
AND Data_table_2.field_5 IN (1,2);
dbms_output.put_line(i_date);
i_date := i_date +1;
END LOOP;
COMMIT; -- Added commit at the end
END;
我只想指出,最有效的方法是尽可能地使用SQL编写查询,而这可以避免使用PL/SQL。SQL和PL/SQL块之间的上下文切换涉及开销。这就是我编写查询的方式。使用connectby的新块将生成i_date和sysdate之间的所有日期
DECLARE
i_date DATE;
BEGIN
DELETE Target_table;
SELECT field_1,
field_2
FROM Data_table_1
JOIN (SELECT i_date + level -1 as i_date_new
FROM DUAL
CONNECT BY LEVEL<=TRUNC(sysdate)-i_date
)dates_generated
ON Data_table_1.Date_field1 >= dates_generated.i_date_new
AND Data_table_1.Date_field1 < dates_generated.i_date_new+1
LEFT JOIN Data_table_2
ON Data_table_1.ACCOUNT_ID =Data_table_2.account_id
WHERE Data_table_1.COST_CENTRE IN ('1','2','3','4','5','6','7','8','9','10')
AND Data_table_1.field_3 IN ('C', 'D')
AND Data_table_1.field_4 IS NULL
AND Data_table_2.field_5 IN (1,2);
END;
发布错误消息总是很有帮助的。使用DateAdd:dateaddd,1,i_date。另外,将i_日期声明为“YYYY-MM-DD”。i日期初始化为字符串。将其转换为日期i_date=转换为日期'2014年1月1日','DD-MON-YYYY'您没有给出所有代码。请使用此代码重新运行agian,因为错误行与您的代码不匹配,并提供您的表结构,因为我认为第二个错误与您的数据类型和列数有关。为此,有更多的END after insert语句,而没有;这个问题与i_date中使用的数据类型无关。我以前使用过相同的语法来声明一个日期,但没有问题。我没有删除任何代码,只是为了便于阅读而对其进行了清理