一个曲奇 2024-06-24 14:22 采纳率: 66.7%
浏览 1
已结题

ORACLE存过A引用存过B来循环处理数据,为什么B报错后会跳出循环,不继续执行存过A了

ORACLE存过A引用存过B来循环处理数据,为什么B报错后会跳出循环,不继续执行存过A了

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-24 14:22
    关注

    引自免费微信小程序:皆我百晓生

    这个问题涉及到Oracle数据库中的循环语句和异常处理机制。在Oracle中,当某个操作失败时,系统通常会抛出一个异常(通常是ORA-01654)。这个错误表明了一个事务正在处理的一个子事务已经结束,并且由于某种原因,它无法完成其任务。

    在您的情况下,如果B操作失败并且跳出了循环,这可能是因为B操作是依赖于A的操作的。在这种情况下,B可能会抛出一个异常,然后Oracle会检查是否有未完成的子事务。如果有,那么就会跳出循环并返回到上一层处理。

    为了解决这个问题,您可以通过在B操作中捕获异常并在循环外处理这些异常来解决这种情况。例如:

    BEGIN
      -- 运行 B 操作
      execute immediate 'BEGIN TRY;
        -- 执行 A 操作
        execute immediate 'SELECT * FROM table_a WHERE id = 1';
        
        IF @status IS NOT NULL THEN
          -- 如果存在状态,则跳转至下一个子事务
          SELECT 'Next subtransaction'; 
        ELSE
          -- 如果不存在状态,则继续执行 B 操作
          SELECT 'Continue to B';
        END IF;
      
      EXCEPTION WHEN OTHERS THEN
        -- 处理异常,例如回滚事务、更新日志等
        UPDATE log_table SET status='error' WHERE id=1;
        RAISE_APPLICATION_ERROR(-20001, 'An error occurred in the B operation.');
      END TRY;
    END;
    

    在这个例子中,如果B操作遇到错误,那么它将触发一个RAISE_APPLICATION_ERROR,并将错误信息写入到日志表中。然后,如果B操作没有发生错误,那么它将继续执行直到达到循环条件。如果B操作抛出了错误,那么它会被回滚,错误信息也会被记录下来。

    注意:这只是一个基本的例子,实际应用中可能需要根据具体的情况进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月25日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 内网办公电脑进行向日葵
  • ¥15 如何输入双曲线的参数a然后画出双曲线?我输入处理函数加上后就没有用了,不知道怎么回事去掉后双曲线可以画出来
  • ¥50 WPF Lidgren.Network.Core2连接问题
  • ¥15 soildworks装配体的尺寸问题
  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建