2016-05-31 4 views
2

У меня есть функция, которая обновляет строки таблицы, обновление выполняется, выбрав самую низкую дату создания и сравнивая соответствующие даты выставления счетов, после увеличения даты создания до самой наибольшей даты создания i Я пытаюсь обновить исходную дату на основе этого выбора.запрос на обновление занимает много времени в oracle

CREATE OR REPLACE FUNCTION OriginatedDate_update(total in Number) 
    RETURN VARCHAR2 
IS 
    intialCount Number(10); 
    temp Number(10); 
    count1 Number(10); 
BEGIN 
    SELECT COUNT(DISTINCT(p2.created_date)) INTO temp FROM discrepancy_grid_info p2 where billing_date is not null; 
    intialCount :=1; 
    temp :=temp+1; 
    WHILE intialCount < temp loop 
    update (SELECT * FROM discrepancy_grid_info p1 WHERE (intialCount-1) = (SELECT COUNT(DISTINCT(p2.created_date)) FROM discrepancy_grid_info p2 WHERE p2.created_date < p1.created_date) and billing_date is not null) f 
    set f.ORIGINATED_DATE=(SELECT MAX(p.ORIGINATED_DATE) FROM DISCREPANCY_GRID_INFO p where p.PRIM_ID=f.PRIM_ID AND p.PLAN_NAME=f.PLAN_NAME and p.PROCESS_INSTANCE_ID IN (select process_instance_id from audit_process where client_vendor_id in (select id from client_vendor where vendor_id=(select vendor_id from client_vendor where id=(select client_vendor_id from audit_process where process_instance_id=f.process_instance_id)) and client_id=(select client_id from client_vendor where id=(select client_vendor_id from audit_process where process_instance_id=f.process_instance_id)))) 
      and p.billing_date between add_months(trunc(f.billing_date,'mm'),-1) and last_day(add_months(trunc(f.billing_date,'mm'),-1)) and p.billing_date is not null and p.created_date < f.created_date group by p.PRIM_ID,p.PLAN_NAME) 
    where f.billing_date is not null; 
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT); 
    count1 :=count1+SQL%ROWCOUNT;  
    intialCount :=intialCount+1; 
    end loop; 
    RETURN count1; 
END; 
+0

Вы должны только пометить СУБД, относящуюся к тому, с чем вы работаете. Вам также нужно будет предоставить более подробную информацию. Фактически, как указано, вы фактически не задавали вопрос вообще. –

+0

показать свой код .. – scaisEdge

+0

код ниже, я новичок в переполнении стека я отправляю в ответ по ошибке – mktl

ответ

3

Выполнить только ОДИН запрос:

update 
    discrepancy_grid_info p1 
    -- WHERE (intialCount-1) = 
    -- (
    -- SELECT * FROM discrepancy_grid_info p1 
    --  WHERE (intialCount-1) = (
    --   SELECT COUNT(DISTINCT(p2.created_date)) 
    --   FROM discrepancy_grid_info p2 
    --   WHERE p2.created_date < p1.created_date 
    -- ) and */ 

set ORIGINATED_DATE=(
    .... rest of your query goes here 
) 
WHERE p1.billing_date is not null ; 

вместо того, чтобы повторять одни и те же десятки запросов, сотни или возможно тысячи количество раз в цикле.
Удалите петлю также, она не нужна.
Запрос может быть оптимизирован futhrer, но это очень простое изменение должно дать huuuuuuuuuge улучшение.

+0

Мне нужен запрос для запуска по возрастающему порядку create_date, нужно установить originate_date = created_date, если дата вычисления равна нулю. Могу ли я достичь этого в одном цикле – mktl

+0

Не могли бы вы объяснить, почему вам нужно «обновлять в порядке certin»? По определению в SQL таблица представляет собой набор неупорядоченных записей, в частности в Oracle, где по умолчанию таблица создается как куча организованной таблицы. Кортежи в таблице не имеют никакого порядка, обновление таблицы в любом порядке не имеет для меня никакого смысла. Запустите один запрос снова ваши данные, а затем запустите свой запрос 1000 раз в порядке, а затем сравните результаты обоих обновлений - есть ли разница? – krokodilko

+0

discrepancy_grid_info Я должен рассмотреть три столбца created_date, originated_date и billing_date. основанный на billing_date, я должен вычислить значение originated_date, если вычисленное значение равно null, а затем дата date = дата создания. это теперь реализовано для записей, которые недавно вставлены с помощью триггера. теперь я хочу обновить старые записи таким же образом. – mktl