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语句以仅获取所需的数据。