Самый быстрый запрос для проверки на существование строки в Oracle?

Можно моделировать закрытые методы как это:

function Restaurant() {
}

Restaurant.prototype = (function() {
    var private_stuff = function() {
        // Private code here
    };

    return {

        constructor:Restaurant,

        use_restroom:function() {
            private_stuff();
        }

    };
})();

var r = new Restaurant();

// This will work:
r.use_restroom();

// This will cause an error:
r.private_stuff();

[еще 113] информация об этой технике здесь: http://webreflection.blogspot.com/2008/04/natural-javascript-private-methods.html

11
задан Josh Kodroff 6 July 2009 в 17:15
поделиться

4 ответа

Использование COUNT (*) нормально, если вы также используете rownum = 1:

declare
   l_cnt integer;
begin
   select count(*)
   into   l_cnt
   from   x
   where  x.col_a = value_a 
   and    x.col_b = value_b
   and    rownum = 1;
end;

Это всегда будет возвращать строку, поэтому нет необходимости обрабатывать какие-либо исключения NO_DATA_FOUND. Значение l_cnt будет 0 (нет строк) или 1 (существует как минимум 1 строка).

16
ответ дан 3 December 2019 в 03:04
поделиться
begin
select 'row DOES exist' 
  into ls_result
from dual
where exists (select null from x where x.col_a = value_a and x.col_b = value_b);
exception
when no_data_found then
  ls_result := ' row does NOT exist';
end;
1
ответ дан 3 December 2019 в 03:04
поделиться
SELECT  NULL
FROM    x
WHERE   x.col_a = value_a
        AND x.col_b = value_b
        AND rownum = 1

COUNT (*) , безусловно, не лучший способ, так как ему нужно будет подсчитать все строки, а ROWNUM = 1 вернется, как только найдет первая соответствующая строка.

Вот код PL / SQL :

DECLARE
        ex INT;
BEGIN
        BEGIN
                SELECT  NULL
                INTO    ex
                FROM    dual
                WHERE   1 = 1
                        AND rownum = 1;
                DBMS_OUTPUT.put_line('found');
        EXCEPTION
        WHEN no_data_found THEN
                DBMS_OUTPUT.put_line('not found');
        END;
END;
5
ответ дан 3 December 2019 в 03:04
поделиться

Я думаю, что использование EXISTS дает более естественный ответ на вопрос, чем попытка оптимизировать COUNT-запрос с помощью ROWNUM.

Позвольте Oracle выполнить оптимизацию ROWNUM за вас.

create or replace function is_exists (
        p_value_a varchar2,
        p_value_b varchar2)
        return boolean
is

   v_exists varchar2(1 char);

begin

    begin
        select 'Y' into v_exists from dual
        where exists
            (select 1 from x where x.col_a = p_value_a and x.col_b = p_value_a);

    exception

        when no_data_found then

            v_exists := null;

    end;

    return v_exists is not null;

end is_exists;
7
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: