使用存储过程读取源表数据到目标表

时间:2021-09-05 11:16:35
源表cdc_test
目标表:test_source
    select operation$,commit_timestamp$,id,name,mark from cdc_test
    查询到一条数据:
OP COMMIT_TIMESTA         ID NAME
-- -------------- ---------- ------------------------------
MARK
--------------------------------------------------
I  05-3月 -18              4 renqinglei4
aa4

存储过程的写法:
create or replace procedure A
is
begin
IF cdc_test.operation$='I' THEN 
           insert into test_source(id,name,mark,statrdate,enddate)
              select t1.id,t1.name,t1.mark,t1.commit_timestamp$,'31-12月-9999' from cdc_test t1;
end if; 

IF cdc_test.operation$='D' THEN
         update test_source 
         set enddate=cdc_test.commit_timestamp$ 
         where id=cdc_test.id 
         and cdc_test.operation$='D';
end if; 

IF
         cdc_test.operation$='UN' THEN
         update test_source 
         set enddate=cdc_test.commit_timestamp$ 
         where id=cdc_test.id 
         and enddate='31-12月-9999'
end if; 

IF
         cdc_test.operation$='UN' THEN
         insert into test_source(id,name,mark,Startdate,enddate) 
         select t1.id,t1.name,t1.mark,t1.commit_timestamp$,'31-12月-9999' from cdc_test t1
end if; 
COMMIT;
end;

执行存储过程无法读取源表的数据到目标表,请问是为什么?

9 个解决方案

#1


你的存储过程的语法有问题,你参考这个改改:

create or replace procedure A
is
begin
  for v_cur in  (select * from cdc_test )
    loop
IF v_cur.operation$='I' THEN 
           insert into test_source(id,name,mark,statrdate,enddate)
              select t1.id,t1.name,t1.mark,t1.commit_timestamp$,to_date('9999-12-31','YYYY-MM-DD') from cdc_test t1 where t1.id=v_cur.id;
end if; 
  
COMMIT;
end loop;
end;

#2


按你的这个写法执行以后数据还是没有写过去

#3


你存储过程估计都编译失败的。先调通,然后
begin
 a;
end;

执行。
使用存储过程读取源表数据到目标表

#4


使用存储过程读取源表数据到目标表
为什么同样的sql我执行起来会报错呢?

#5


是把存储过程里面的 begin end 复制出来
用 
declare
你前面过程的参数定义一下;
begin
存储过程里面的 begin end 中间的;
end
这种方式 进行调试

#6


引用 4 楼 wildwolv 的回复:
使用存储过程读取源表数据到目标表
为什么同样的sql我执行起来会报错呢?

存储过程编译失败了,你打开来看是啥错误

#7


使用存储过程读取源表数据到目标表
先纠正错误,编译通过

#8


后两个 if 内的语句,结尾没有写分号。

#9


我发现了,我把test_source表里的startdate名字写错了 使用存储过程读取源表数据到目标表
谢谢各位!

#1


你的存储过程的语法有问题,你参考这个改改:

create or replace procedure A
is
begin
  for v_cur in  (select * from cdc_test )
    loop
IF v_cur.operation$='I' THEN 
           insert into test_source(id,name,mark,statrdate,enddate)
              select t1.id,t1.name,t1.mark,t1.commit_timestamp$,to_date('9999-12-31','YYYY-MM-DD') from cdc_test t1 where t1.id=v_cur.id;
end if; 
  
COMMIT;
end loop;
end;

#2


按你的这个写法执行以后数据还是没有写过去

#3


你存储过程估计都编译失败的。先调通,然后
begin
 a;
end;

执行。
使用存储过程读取源表数据到目标表

#4


使用存储过程读取源表数据到目标表
为什么同样的sql我执行起来会报错呢?

#5


是把存储过程里面的 begin end 复制出来
用 
declare
你前面过程的参数定义一下;
begin
存储过程里面的 begin end 中间的;
end
这种方式 进行调试

#6


引用 4 楼 wildwolv 的回复:
使用存储过程读取源表数据到目标表
为什么同样的sql我执行起来会报错呢?

存储过程编译失败了,你打开来看是啥错误

#7


使用存储过程读取源表数据到目标表
先纠正错误,编译通过

#8


后两个 if 内的语句,结尾没有写分号。

#9


我发现了,我把test_source表里的startdate名字写错了 使用存储过程读取源表数据到目标表
谢谢各位!