gpt4 book ai didi

Oracle Ref Cursor Vs Select into 异常处理

转载 作者:行者123 更新时间:2023-12-01 07:49:15 25 4
gpt4 key购买 nike

我有几个场景:

  • 需要以预定义的顺序从三个不同的表中读取列的值,并且只有 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 Ref Cursor Vs Select into 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/801805/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com