Oracle Forms - как ускорить триггер POST_QUERY? - PullRequest
0 голосов
/ 15 апреля 2019

Это код, с которым я имею дело:

declare
    --some cursors here

begin
    if some_condition = 'N' then
        raise form_trigger_failure;
    end if;

    --some fetches here
end;

Это из триггера пост-запроса, и в основном моя проблема в том, что мой блок в формах Oracle возвращает 20 тыс. Строк, а триггер пост-запроса запускается для каждогоиз рядов.Выполнение занимает пару минут, и я хочу ускорить его до пары секунд.Данные проверяются в some_condition (это функция, но она очень быстро возвращает значение).Если условие не выполнено, то создается form_trigger_failure.Есть ли способ ускорить эту проверку без изменения логики?(Необходимо вернуть такое же количество строк, эта проверка важна)

Я пытался изменить свойства блока, но это мне не помогло.Кроме того, когда я удалил целое выражение if, данные были возвращены очень быстро, но они не были проверены и были возвращены строки, которые не должны быть видны.

1 Ответ

2 голосов
/ 16 апреля 2019

Данные проверены в некотором условии ...

Все в порядке;но зачем выполнять проверку в триггере POST-QUERY?Он выбирает данные, которые уже существуют в базе данных, поэтому должно быть действительным.В противном случае, почему вы сохранили его в первую очередь?

POST-QUERY следует использовать для заполнения элементов не из базы данных.

Проверка должна обрабатываться в триггерах WHEN-VALIDATE-ITEM или WHEN-VALIDATE-RECORDне в POST-QUERY.

Я предлагаю вам разделить эти два действия.Если определенные части кода могут / должны быть разделены между этими двумя типами триггеров, поместите его в процедуру (внутри формы) и при необходимости вызовите ее.

Кстати, POST-QUERY не сработаетдля всех 20К строк (если вы не буферизуете столько строк, и - если вы делаете - не должны).

Более того, говорят, что функция возвращает результат очень быстро - возможно, если она выполняется для одной строки.Пусть он работает на 200, 2000, 20000 строк как

select your_function(some_parameters) 
from that_table
where rownum < 2;  --> change 2 to 200 to 2000 to 20000 and see what happens

С другой стороны, какова цель получения 20 000 строк?Кто собирается рассмотреть это?Вы уверены, что именно так вы должны это делать?Если это так, рассмотрите возможность перехода к хранимой процедуре;пусть он выполнит эти проверки в базе данных и позволит форме извлекать «чистые» данные.

...