目标表: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;
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;
执行。
begin
a;
end;
执行。
#4
为什么同样的sql我执行起来会报错呢?
#5
是把存储过程里面的 begin end 复制出来
用
declare
你前面过程的参数定义一下;
begin
存储过程里面的 begin end 中间的;
end
这种方式 进行调试
用
declare
你前面过程的参数定义一下;
begin
存储过程里面的 begin end 中间的;
end
这种方式 进行调试
#6
存储过程编译失败了,你打开来看是啥错误
#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;
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;
执行。
begin
a;
end;
执行。
#4
为什么同样的sql我执行起来会报错呢?
#5
是把存储过程里面的 begin end 复制出来
用
declare
你前面过程的参数定义一下;
begin
存储过程里面的 begin end 中间的;
end
这种方式 进行调试
用
declare
你前面过程的参数定义一下;
begin
存储过程里面的 begin end 中间的;
end
这种方式 进行调试
#6
存储过程编译失败了,你打开来看是啥错误
#7
先纠正错误,编译通过
#8
后两个 if 内的语句,结尾没有写分号。
#9
我发现了,我把test_source表里的startdate名字写错了
谢谢各位!
谢谢各位!