Loops Oracle 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

嘿,伙计们,尝试使用循环来循环几天,这样我的脚本就不会失败循环每次都无法执行我不确定我做错了什么,但是我知道事实上select语句是好的,它只是我遇到麻烦的循环,也可以让循环检查表中的最大日期只删除最长的日期吗如果数据不完整,则只添加到日期所需的内容

错误行41,第4列: PL/SQL:ORA-00933:SQL命令未正确结束 ORA-06550:第7m行第1列: 忽略Pl/sql语句

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中使用的数据类型无关。我以前使用过相同的语法来声明一个日期,但没有问题。我没有删除任何代码,只是为了便于阅读而对其进行了清理