Я хочу обновить FirstTable из SecondTable, но есть много сложностей.
Это основной запрос:
UPDATE x.FirstTable Table1
set Table1.UpdatedColumn = (
SELECT Table2.V_PROD_CODE
FROM y.SecondTable Table2
WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1
AND Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2
AND Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3
AND Table2.c_Date between '17-Apr-2018' and '27-Apr-2018'
AND Table2.c_DATE = Table1.c_date)
WHERE Table1.c_date between '17-Apr-2018' and '27-Apr-2018'
AND length(Table1.xx_v_account_id1) = 12;
Это занимает слишком много времени, поэтому я подумал о создании курсора:
create or replace procedure wco as
cursor UpdateCursor is
SELECT Table2.V_PROD_CODE
FROM y.SecondTable Table2
INNER JOIN x.FirstTable Table1 on SUBSTR(Table1.V_CAST_REF_CODE, 6, 8) = SUBSTR(Table2.V_CAST_REF_CODE, 6, 8)
WHERE Table2.XX_PRODUCT_CODECCOUNT_ID1 = Table1.XX_PRODUCT_CODECCOUNT_ID1
AND Table2.XX_PRODUCT_CODECCOUNT_ID2 = Table1.XX_PRODUCT_CODECCOUNT_ID2
AND Table2.XX_PRODUCT_CODECCOUNT_ID3 = Table1.XX_PRODUCT_CODECCOUNT_ID3
AND Table2.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
AND Table2.c_DATE = Table1.c_date
for update;
v_PRODUCT_CODE Table2.V_PROD_CODE%type;
begin
open UpdateCursor;
loop
fetch UpdateCursor into v_PRODUCT_CODE;
exit when UpdateCursor%notfound;
update XXBADWH.xxba_dwh_instrument_master INST
set INST.v_product_code = v_PRODUCT_CODE
WHERE current of UpdateCursor
AND INST.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
AND length (INST.xx_v_account_id1) = 12;
end loop;
close UpdateCursor;
end;
exec wco;
drop procedure wco;
Что не так с запросом? а какие-нибудь лучшие практики?