Sql PLS-00103:在预期以下情况时遇到符号“FETCH”

Sql PLS-00103:在预期以下情况时遇到符号“FETCH”,sql,oracle,Sql,Oracle,创建了一个过程,如下所示: create or replace PROCEDURE TEST AS BEGIN DECLARE c_service process_state.service%type; c_tr_source process_state.tr_source%type; CURSOR c_process_state is SELECT service, tr_source FROM process_state;

创建了一个过程,如下所示:

 create or replace
  PROCEDURE TEST AS 
  BEGIN
  DECLARE
     c_service process_state.service%type;
     c_tr_source process_state.tr_source%type;

     CURSOR c_process_state is
        SELECT service, tr_source FROM process_state;

          OPEN c_process_state;
           LOOP
           FETCH c_process_state into c_service, c_tr_source;
             insert into process_state_archive values (c_service, c_tr_source);
             commit;
           EXIT WHEN c_process_state%notfound;
           END LOOP;   
     CLOSE c_process_state;
   END TEST;
编译后,我遇到了一些错误:

错误33,4:PLS-00103:在预期以下情况之一时遇到符号提取:常量异常表长双参考字符时间戳间隔日期

错误44,4:PLS-00103:在预期以下情况之一时遇到符号CLOSE:end not pragma final instantiable volgorde重写静态成员构造函数映射


谁能解释一下这个问题吗?我是初学者,正在学习SQL。

1您应该在开始之前声明游标,而不是在开始之后声明游标,并且应该在获取之后立即声明游标

create or replace
  PROCEDURE TEST AS 

     c_service process_state.service%type;
     c_tr_source process_state.tr_source%type;
CURSOR c_process_state is
        SELECT service, tr_source FROM process_state;
  BEGIN

          OPEN c_process_state;
           LOOP
           FETCH c_process_state into c_service, c_tr_source;
           EXIT WHEN c_process_state%notfound;
             insert into process_state_archive values (c_service, c_tr_source);
             commit;

           END LOOP;   
     CLOSE c_process_state;
   END TEST;
2您的任务似乎可以在一条语句中解决,而不是使用游标执行大量代码:

INSERT INTO process_state_archive select service, tr_source FROM process_state;

该死,迟到了30秒。谢谢你宝贵的建议。我有800万条记录在进程状态表中。我必须在过程状态下保存最近3个月的数据。b存档过去4到12个月的过程中的数据\u状态\u存档c和12个月之前的所有数据,需要清除。我的问题是,我们能否在满足某些条件的情况下使用insert into select*from-语句来实现上述场景?是的,您可以添加WHERE filter to select语句以仅获取所需的数据。