Как обновить значение столбца в таблицу из другой таблицы в хранимой процедуре? - PullRequest
1 голос
/ 11 мая 2019

Я создал процедуру из запросов к другим таблицам, включая транзакцию tbl, для сопоставления всех записей транзакций со ссылочным номером и автоматически отмеченной датой.

Я пытаюсь сгенерировать мою settle_transaction процедурумой запрос из выбранного оператора и вставить их в таблицу расчетов.Между тем, мне также нужно update ref_num и обработанная дата как «штамп» к таблице транзакций, чтобы у меня не было дублированного расчета при повторном вызове процедуры.В противном случае, я не знаю, как прекратить показывать одни и те же данные расчета дважды

Ниже приведена процедура вывода таблицы расчета и структуры, аналогичной приведенной ниже:

BEGIN
    for r_client in 
    (
        select clientid,
        client_name, sum(transaction) total_amount
        from transaction_tbl tran join terminal_tbl term
        on tran.terminalid = term.terminalid join client_tbl c on c.clientid = term.clientid
        where refnr is null
    )
    loop
    v_refnr := get_refnr;
        insert into settlement_tbl
        (
            Ref_Num, 
            Total,
            CLIENTID,
            TITLE, 
            processeddate
        )
        values (v_refnr, total_amount, clientid,
        name,sysdate);
update_refnr(v_refnr, sysdate)
        end loop;
END

Вывод:

| reference_num | total amount | client id | client name | processed_date |
|---------------|--------------|-----------|-------------|----------------|

Когда я выполняю описанную выше процедуру, он заполняет все результаты запроса select.Тем не менее, если я выполню снова, он будет дублировать тот же результат, особенно общую сумму.

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

Я использую ref. no# и process_date для обновления существующего ссылочного номера и даты до транзакции, показанной ниже.

| transaction_num | transaction amount | reference_num | processed_date |
|-----------------|--------------------|---------------|----------------|

Вот код попытки, который я поместил внутрипроцедура расчета, но все еще показывает дублированные записи и не может обновиться до транзакции tbl.

procedure update_refnr(
  p_refnr in number,
  p_processeddate in date
)
is
begin
    UPDATE TRANSACTION t 
       SET t.refnr = p_refnr
     WHERE EXISTS (SELECT p_processeddate 
                     FROM terminal_tbl
                    WHERE t.TERMINALID= term.TERMINALID
                      AND t.processeddate = p_processeddate
                      AND t.refnr IS NULL);   
--exception handling below

end update_refnr;

Я также пробовал другой SQL ссылка , но не может скомпилировать.

В идеале,У меня нет дублированных записей в моей таблице расчетов при извлечении каждой записи из моей хранимой процедуры.

1 Ответ

1 голос
/ 11 мая 2019

Вы хотите вставить новые данные в вашу таблицу только тогда, когда они еще не существуют. Как уже говорили другие, вы можете использовать MERGE для этого:

BEGIN
  for r_client in (select clientid,
                          client_name,
                          sum(transaction) total_amount
                     from transaction_tbl tran
                     join terminal_tbl term
                       on tran.terminalid = term.terminalid
                     join client_tbl c
                       on c.clientid = term.clientid
                     where refnr is null)
  loop
    v_refnr := get_refnr;

    MERGE INTO settlement_tbl s
      USING (SELECT v_refnr      AS REF_NUM,
                    total_amount AS TOTAL,
                    clientid     AS CLIENTID,
                    name         AS TITLE,
                    SYSDATE      AS PROCESSEDDATE
               FROM DUAL) d
        ON (s.REF_NUM = d.REF_NUM)
      WHEN NOT MATCHED THEN
        INSERT (Ref_Num,   Total,   CLIENTID,   TITLE,   processeddate)
        VALUES (d.REF_NUM, d.TOTAL, d.CLIENTID, d.TITLE, d.PROCESSEDDATE);

    update_refnr(v_refnr, sysdate);
  END LOOP;
END;

WHEN NOT MATCHED вставляет новые данные, когда v_refnr еще не существует в вашей таблице.

Удачи.

...