Oracle Ref Cursor Vs Select into 异常处理

落叶无声 阅读:40 2024-02-27 23:08:18 评论:0

我有几个场景:

  • 需要以预定义的顺序从三个不同的表中读取列的值,并且只有 1 个表将具有数据
  • 如果记录存在给定条件,则从表 1 中读取数据,否则从表 2 中针对给定条件读取数据

  • 在 Oracle 存储过程中

    现在处理这些的方式是首先将给定查询的计数放入变量中,如果计数 > 0,则我们执行相同的查询以读取实际数据,如下所示:
    select count(*) from table1 into v_count 
    if v_count > 0 
    then 
        select data into v_data from table1 
    end if; 
     
    Return v_data 
    

    这样做是为了避免 no_data_found 异常,否则我将需要三个异常处理程序块来捕获每个表访问的 no_data_found 异常。

    目前我正在用 Cursors 重新实现它,以便我有这样的东西:
    cursor C1 is 
        select data from table1; 
    Open C1 
    Fetch C1 into v_data 
    if C1%FOUND 
    then 
        Close C1 
        Return v_data 
    End If 
    

    我想从性能的角度找出哪个更好 - 带有游标的一种,或者将 Select 放入变量并具有三个 no_data_found Exception 块的一种。我不想使用我们目前拥有的两阶段查询过程。

    请您参考如下方法:

    我不知道你为什么那么热衷于避免异常?出什么问题了:

    begin 
        begin 
            select data into v_data from table1; 
        exception 
            when no_data_found then 
            begin 
                select data into v_data from table2; 
            exception 
                when no_data_found then 
                begin 
                   select data into v_data from table3; 
                exception 
                    when no_data_found then 
                        v_data := null; 
                end; 
            end; 
        end; 
        return v_data; 
    end; 
    

    我相信这会比你的其他解决方案表现得更好,因为它做了尽可能少的工作来达到预期的结果。

    How bad is ignoring Oracle DUP_VAL_ON_INDEX exception?我在这里演示了使用异常比计数来查看是否有任何数据的性能更好。


    标签:oracle
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号