существует длительная проблема с приведенным ниже кодом, пожалуйста, помогите исправить эту проблему. Заранее спасибо.
Declare
l_status varchar2(10);
Begin
Insert into @table_name (ENTRP_CUST_ID_NUM, CUST_SROGT_ID, TRD_REF_NUM, CNTRY_CD)
Select ENTRP_CUST_ID_NUM, CUST_SROGT_ID, TRD_REF_NUM, CNTRY_CD
from {{sourceTableLatest('Aggregation[table]')}} partition ({{getSourcePartitionNameLatest('Aggregation[table]')}});
Commit;
For i in ( Select mfu_source.Customer_Surrogate_ID CUST_SROGT_ID, Agg.TRD_REF_NUM TRD_REF_NUM, mfu_source.Enterprise_Customer_ID ENTRP_CUST_ID_NUM
from {{sourceTableLatest('Aggregation[table]')}} partition ({{getSourcePartitionNameLatest('Aggregation[table]')}}) AGG,
{{sourceTableLatest('mfu_table')}} partition ({{getSourcePartitionNameLatest('mfu_table')}}) mfu_source
Where (mfu_source.TA_LINK_ID=AGG.TRD_REF_NUM or mfu_source.TRANSACTION_ID=AGG.TRD_REF_NUM)
and trim(AGG.ENTRP_CUST_ID_NUM) is null)
Loop
Update @table_name set ENTRP_CUST_ID_NUM= i.ENTRP_CUST_ID_NUM where TRD_REF_NUM=i.TRD_REF_NUM;
Commit;
End Loop;
END;
приведенный выше код занимает много времени, необходимо решить проблему простым и легким способом.


Вам не нужен цикл, вы можете запустить его с помощью одного оператора UPDATE. Кроме того, вам следует перейти на современный (ну, он существует уже более 20 лет) синтаксис соединения ANSI.
UPDATE @table_name SET ENTRP_CUST_ID_NUM = (
SELECT mfu_source.Enterprise_Customer_ID
FROM {{sourceTableLatest('Aggregation[table]')}} PARTITION ({{getSourcePartitionNameLatest('Aggregation[table]')}}) AGG
JOIN {{sourceTableLatest('mfu_table')}} PARTITION ({{getSourcePartitionNameLatest('mfu_table')}}) mfu_source ON mfu_source.TA_LINK_ID = AGG.TRD_REF_NUM OR mfu_source.TRANSACTION_ID = AGG.TRD_REF_NUM
WHERE TRIM(AGG.ENTRP_CUST_ID_NUM) IS NULL
AND TRD_REF_NUM = Agg.TRD_REF_NUM)
WHERE EXISTS
(SELECT 'x'
FROM {{sourceTableLatest('Aggregation[table]')}} PARTITION ({{getSourcePartitionNameLatest('Aggregation[table]')}}) AGG
JOIN {{sourceTableLatest('mfu_table')}} PARTITION ({{getSourcePartitionNameLatest('mfu_table')}}) mfu_source ON mfu_source.TA_LINK_ID = AGG.TRD_REF_NUM OR mfu_source.TRANSACTION_ID = AGG.TRD_REF_NUM
WHERE TRIM(AGG.ENTRP_CUST_ID_NUM) IS NULL
AND TRD_REF_NUM = Agg.TRD_REF_NUM)
Ничего, он просто проверяет, существует ли запись. Если вы не ставите это условие, то записи, у которых нет совпадений в @table_name, будут обновлены на NULL.
приведенный выше оператор обновления, который я пробовал, но столкнулся с ошибкой Ошибка в ActionStatement ORA-01427: однострочный подзапрос возвращает более одной строки ORA-06512: в строке 9
Попробуйте SELECT DISTINCT mfu_source.Enterprise_Customer_ID .... Если вы по-прежнему получаете сообщение об ошибке, просмотрите свои данные и решите, какие из них будут использоваться для обновления.
@Wernfried Domscheit спасибо за решение. не могли бы вы объяснить, потому что я впервые вижу что-то подобное в Oracle {{sourceTableLatest('Aggregation[table]')}} PARTITION ({{getSourcePartitionNameLatest('Aggregation [таблица]')}}) AGG Что собственно делать? Спасибо
@Florin Я предполагаю, что код генерируется динамически, {{ }} используется в качестве шаблона, например. jinja.palletsprojects.com/en/2.11.x/templates
@Wernfried Domscheit спасибо за ответ, а также за предоставление документации
Вы можете использовать один оператор MERGE (а не несколько операторов в цикле):
Declare
l_status varchar2(10);
Begin
Insert into @table_name (ENTRP_CUST_ID_NUM, CUST_SROGT_ID, TRD_REF_NUM, CNTRY_CD)
Select ENTRP_CUST_ID_NUM, CUST_SROGT_ID, TRD_REF_NUM, CNTRY_CD
from {{sourceTableLatest('Aggregation[table]')}} partition ({{getSourcePartitionNameLatest('Aggregation[table]')}});
MERGE INTO @table_name dst
USING (
Select mfu_source.Customer_Surrogate_ID CUST_SROGT_ID,
Agg.TRD_REF_NUM TRD_REF_NUM,
mfu_source.Enterprise_Customer_ID ENTRP_CUST_ID_NUM
from {{sourceTableLatest('Aggregation[table]')}} partition ({{getSourcePartitionNameLatest('Aggregation[table]')}}) AGG
INNER JOIN {{sourceTableLatest('mfu_table')}} partition ({{getSourcePartitionNameLatest('mfu_table')}}) mfu_source
ON mfu_source.TA_LINK_ID = AGG.TRD_REF_NUM
or mfu_source.TRANSACTION_ID = AGG.TRD_REF_NUM
Where trim(AGG.ENTRP_CUST_ID_NUM) is null
) src
ON dst.TRD_REF_NUM = src.TRD_REF_NUM
WHEN MATCHED THEN
UPDATE
SET dst.ENTRP_CUST_ID_NUM = src.ENTRP_CUST_ID_NUM;
Commit;
END;
/
ГДЕ СУЩЕСТВУЕТ (SELECT 'x' - означает, на какие поля он ссылается?