Долгосрочная проблема с Oracle PLSQL

существует длительная проблема с приведенным ниже кодом, пожалуйста, помогите исправить эту проблему. Заранее спасибо.

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;

приведенный выше код занимает много времени, необходимо решить проблему простым и легким способом.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужен цикл, вы можете запустить его с помощью одного оператора 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)

ГДЕ СУЩЕСТВУЕТ (SELECT 'x' - означает, на какие поля он ссылается?

Guru G 19.06.2023 09:41

Ничего, он просто проверяет, существует ли запись. Если вы не ставите это условие, то записи, у которых нет совпадений в @table_name, будут обновлены на NULL.

Wernfried Domscheit 19.06.2023 09:44

приведенный выше оператор обновления, который я пробовал, но столкнулся с ошибкой Ошибка в ActionStatement ORA-01427: однострочный подзапрос возвращает более одной строки ORA-06512: в строке 9

Guru G 19.06.2023 12:32

Попробуйте SELECT DISTINCT mfu_source.Enterprise_Customer_ID .... Если вы по-прежнему получаете сообщение об ошибке, просмотрите свои данные и решите, какие из них будут использоваться для обновления.

Wernfried Domscheit 19.06.2023 12:46

@Wernfried Domscheit спасибо за решение. не могли бы вы объяснить, потому что я впервые вижу что-то подобное в Oracle {{sourceTableLatest('Aggregation[table]')}} PARTITION ({{getSourcePartitionNameLatest('Aggregation [таблица]')}}) AGG Что собственно делать? Спасибо

Florin 19.06.2023 19:03

@Florin Я предполагаю, что код генерируется динамически, {{ }} используется в качестве шаблона, например. jinja.palletsprojects.com/en/2.11.x/templates

Wernfried Domscheit 19.06.2023 21:14

@Wernfried Domscheit спасибо за ответ, а также за предоставление документации

Florin 19.06.2023 21:18
Ответ принят как подходящий

Вы можете использовать один оператор 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;
/

Другие вопросы по теме