如何让存储过程报错后继续执行?

本白 2018-03-23 09:40:51
代码如下:
create or replace procedure PROC_L_SXBZXR1
is
v_sql Varchar2(20000) Default '';
v_table varchar2(200) Default '';
begin
for rs in
(
select upper(a.table_en_name) table_en_name
from DEP_MATTERS_LIST@XYQH a
where id in (select DEP_MATTERS_LIST_ID from DEP_MATTERS_LIST_COLUMN@xyqh
where upper(en_name) = upper('xy20214001') and del_flag=0)
and is_build=1 and del_flag=0 and SYS_CREDIT_CORPUS_CODE='L' and state=1
)loop
begin
v_table :=rs.table_en_name;
v_sql :='MERGE INTO t_l_c060102 t1 USING (
select
id,
xy10101001,
xy10101002,
xy10101003,
xy10101004,
xy10101005,
xy10101006,
xy20214001,
xy20214003,
xy20214004,
xy20214005,
xy20214006,
xy20214007,
xy20214008,
xy20214009,
xy20214010,
xy20214011,
xy20214012,
xy20214013,
xy20214014,
xy10101007,
xy10101008,
xy10101009,
shield_sate,
innerid,
sub_type,
clean_date,
is_mate,
dep_id,
m_010101,
user_id,
modify_date,
create_date,
city_code,
region_code,
day_id,
than_date,
is_clean,
is_peat,
province_code,
publish_state,
publish_valid_date,
rule_id,
shield_date,
shield_user_id,
publish_date,
publish_user_id
from '||rs.table_en_name||'@XYQH) t2

ON ( t1.id=t2.id)
WHEN MATCHED THEN
UPDATE SET
t1.xy10101001 = t2.xy10101001 ,
t1.xy10101002 = t2.xy10101002 ,
t1.xy10101003 = t2.xy10101003 ,
t1.xy10101004 = t2.xy10101004 ,
t1.xy10101005 = t2.xy10101005 ,
t1.xy10101006 = t2.xy10101006 ,
t1.rule_id = t2.rule_id ,
t1.innerid = t2.innerid ,
t1.is_mate = t2.is_mate ,
t1.m_010101 = t2.m_010101 ,
t1.modify_date = t2.modify_date ,
t1.create_date = t2.create_date ,

t1.region_code = t2.region_code ,
t1.day_id = t2.day_id ,
t1.than_date = t2.than_date ,
t1.is_peat = t2.is_peat ,
t1.province_code = t2.province_code ,

t1.city_code = t2.city_code ,
t1.bzxr = t2.xy10101001 ,
t1.dmlx = 0 ,
t1.dm = t2.xy10101002 ,
t1.fddbrxm = t2.xy10101007 ,
t1.fddbrzj = t2.xy10101009 ,
t1.ah = t2.xy20214001 ,
t1.zxfy = t2.xy20214003 ,
t1.zxyj = t2.xy20214006 ,
t1.lasj = t2.xy20214012 ,
t1.zczxdw = t2.xy20214007 ,
t1.sxflwsqddyw = t2.xy20214008 ,
t1.bzxrlxqk = t2.xy20214009 ,
t1.sxbzxrxwjtqx = t2.xy20214010
WHEN NOT MATCHED THEN
insert (
t1.id,
t1.xy10101001,
t1.xy10101002,
t1.xy10101003,
t1.xy10101004,
t1.xy10101005,
t1.xy10101006,
t1.rule_id,
t1.innerid,
t1.is_mate,
t1.m_010101,
t1.modify_date,
t1.create_date,

t1.region_code,
t1.day_id,
t1.than_date,
t1.is_peat,
t1.province_code,

t1.city_code,
t1.bzxr,
t1.dmlx,
t1.dm,
t1.fddbrxm,
t1.fddbrzj,
t1.ah,
t1.zxfy,
t1.zxyj,
t1.lasj,
t1.zczxdw,
t1.sxflwsqddyw,
t1.bzxrlxqk,
t1.sxbzxrxwjtqx
)
values
(
t2.id ,
t2.xy10101001 ,
t2.xy10101002 ,
t2.xy10101003 ,
t2.xy10101004 ,
t2.xy10101005 ,
t2.xy10101006 ,
t2.rule_id ,
t2.innerid ,
t2.is_mate ,
t2.m_010101 ,
t2.modify_date ,
t2.create_date ,

t2.region_code ,
t2.day_id ,
t2.than_date ,
t2.is_peat ,
t2.province_code ,

t2.city_code ,
t2.xy10101001 ,
0 ,
t2.xy10101002 ,
t2.xy10101007 ,
t2.xy10101009 ,
t2.xy20214001 ,
t2.xy20214003 ,
t2.xy20214006 ,
t2.xy20214012 ,
t2.xy20214007 ,
t2.xy20214008 ,
t2.xy20214009 ,
t2.xy20214010
)';
Execute Immediate v_sql ;
commit;
exception
when others then null;
end;
end loop;
end;

我写这段代码的本意是,希望存储过程在报错的情况下,继续执行,但是在报错后,它就直接跳出了,我不知道问题出在哪,报错的信息是‘xy10101009’这个字段无法识别,我查过了,是我要导入的其中一个表里没有这个字段的原因。请教下各位,如何让它在报错后,继续执行呢?
...全文
1453 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
本白 2018-03-26
  • 打赏
  • 举报
回复
引用 12 楼 cattpon 的回复:
明明出错了还要继续执行?
只是个别表结构不同而已
cattpon 2018-03-25
  • 打赏
  • 举报
回复
明明出错了还要继续执行?
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
[quote=引用 2 楼 chfyljt 的回复:] 你的意思是要我把merge into 这个语句拆开写?
你的过程没有问题的,忽略 1#吧,我再看看 [/quote] img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/25.gif][/img] 我刚才又执行了一遍,它又成功了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
[quote=引用 2 楼 chfyljt 的回复:] 你的意思是要我把merge into 这个语句拆开写?
你的过程没有问题的,忽略 1#吧,我再看看 [/quote] 我之前是在网上查了下,才写成这样的,网上的都说是对的,可我执行的时候,遇到错误它就停了,后来我把异常打出来才知道,是某一个表里,没有那个列。我也很奇怪啊~~~
卖水果的net 2018-03-23
  • 打赏
  • 举报
回复
引用 2 楼 chfyljt 的回复:
你的意思是要我把merge into 这个语句拆开写?
你的过程没有问题的,忽略 1#吧,我再看看
卖水果的net 2018-03-23
  • 打赏
  • 举报
回复
-- 每一行语句都要包含在 begin end 中

begin
update .. -- 这里是第一句
exception when others then null;
end;

begin
update 。。-- 这里是第二句。
exception when others then null
end;
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
-- 每一行语句都要包含在 begin end 中

begin
update .. -- 这里是第一句
exception when others then null;
end;

begin
update 。。-- 这里是第二句。
exception when others then null
end;
你的意思是要我把merge into 这个语句拆开写?
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 9 楼 wmxcn2000 的回复:
在拼接这个 merge 之前,先动态生成这些 列名。 可以考虑使用 listagg 函数;
这是生成的列名
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 9 楼 wmxcn2000 的回复:
在拼接这个 merge 之前,先动态生成这些 列名。 可以考虑使用 listagg 函数;
版主,你好,我已经使用listagg生成了列名,请问接下来呢?每个表的情况不同,有的缺少5个字段,有的缺少1个,是要做判断吗?还是怎么操作呢?望版主不吝赐教~
卖水果的net 2018-03-23
  • 打赏
  • 举报
回复
在拼接这个 merge 之前,先动态生成这些 列名。 可以考虑使用 listagg 函数;
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
[quote=引用 5 楼 chfyljt 的回复:] img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/25.gif][/img] 我刚才又执行了一遍,它又成功了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
你用的哪个客户端,如果是 plsql developer 。会有这样的问题,大概如下: 1、你编写了一个存储过程,并且编译没有问题。 2、你右键(测试)开始调试你的这个过程,发现有问题。 3、你把存储过程修改了一下。 4、再次进行调试,如果你用的还是之前的那个调试窗口,就会出现原来同样的错误。 如果关闭原来的窗口,新打开一个,就没有问题。[/quote] 另外,我还想请教个问题,是这样的,我的这个存储过程是将所有符合条件的表的数据进行抽取,然后插入到另一个表里,但是有些表会少字段,比如我在问题里写的那个字段‘xy10101009’,现在我还想请教下,如何在某张表缺少字段的情况下,依然能将这张表其他字段的数据插入进去呢?
本白 2018-03-23
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
[quote=引用 5 楼 chfyljt 的回复:] img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/25.gif][/img] 我刚才又执行了一遍,它又成功了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
你用的哪个客户端,如果是 plsql developer 。会有这样的问题,大概如下: 1、你编写了一个存储过程,并且编译没有问题。 2、你右键(测试)开始调试你的这个过程,发现有问题。 3、你把存储过程修改了一下。 4、再次进行调试,如果你用的还是之前的那个调试窗口,就会出现原来同样的错误。 如果关闭原来的窗口,新打开一个,就没有问题。[/quote] 我的确用的是plsql,在这之前,我的存储过程不是这样写的,我是在网上搜了一下,然后把之前的存储过程改成了现在的样子,不过我没有编辑存储过程,而是选择覆盖的方法把之前的覆盖掉了,然后无论怎么执行数据就是导入不到目标表里,今天大概中午的时候,我又重新执行了一次,就好了
卖水果的net 2018-03-23
  • 打赏
  • 举报
回复
引用 5 楼 chfyljt 的回复:
img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/25.gif][/img] 我刚才又执行了一遍,它又成功了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
你用的哪个客户端,如果是 plsql developer 。会有这样的问题,大概如下: 1、你编写了一个存储过程,并且编译没有问题。 2、你右键(测试)开始调试你的这个过程,发现有问题。 3、你把存储过程修改了一下。 4、再次进行调试,如果你用的还是之前的那个调试窗口,就会出现原来同样的错误。 如果关闭原来的窗口,新打开一个,就没有问题。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧