объединить в oracle обновление значения, но не вставляя, ни давая ошибку версии 11g - PullRequest
0 голосов
/ 20 апреля 2020

Обновление работает нормально, но вставка не выдает никакой ошибки, и вставка не может понять проблему.

Единая таблица, в которую я хочу вставить / обновить значения

  MERGE INTO SOFT_FILENAME A
  USING (select TC, TC_DT, LASTNO
           FROM SOFT_FILENAME
          where TC = 'KMB'
            AND to_date(tc_dt,'dd-mon-yyyy') = to_date(sysdate,'dd-mon-yyyy')) B
  ON ( A.TC = 'KMB'  AND to_date(A.tc_dt,'dd-mon-yyyy') = to_date(sysdate,'dd-mon-yyyy') AND A.TC_DT = B.TC_DT AND A.TC = B.TC)

  when matched then

    UPDATE
       SET A.LASTNO = A.LASTNO + 1
     WHERE A.TC = 'KMB'
       AND to_date(A.tc_dt,'dd-mon-yyyy') = to_date(sysdate,'dd-mon-yyyy')


  WHEN NOT MATCHED THEN

    INSERT (A.TC, A.TC_DT, A.LASTNO) VALUES ('KMB', to_date(sysdate,'dd-mon-yyyy'), 1);

Таблица сценариев

create table A
(
  TC     CHAR(3),
  TC_DT  DATE,
  LASTNO NUMBER(6)
)

Другой способ добиться этого с помощью процедуры заключается в следующем, но я не хочу вызывать процедуру. Вот что я хочу достичь с помощью слияния.

begin
  select count(1)
    into cou  
    FROM SOFT_FILENAME
   where TC = V_TC
     AND to_date(tc_dt, 'dd-mon-yyyy') = to_date(sysdate, 'dd-mon-yyyy');
  if (cou = 0) then
    INSERT into SOFT_FILENAME A
      (A.TC, A.TC_DT, A.LASTNO)
    VALUES
      (V_TC, sysdate, 1);
  else
    UPDATE SOFT_FILENAME A
       SET A.LASTNO = A.LASTNO + 1
     WHERE A.TC = V_TC
       AND
       to_date(A.tc_dt, 'dd-mon-yyyy') =
           to_date(sysdate, 'dd-mon-yyyy'); 
  end if;
end

...