2017-02-23 66 views
0

У меня есть таблица определяется следующим образом:Oracle обновление существующей записи или вставить новый

CIC3.WBCOURSEACTIVITY 
(
    WCA_RID   NUMBER, 
    WCA_TNA_ID  NUMBER, 
    WCA_REG_RID  NUMBER, 
    WCA_ANSWERED_PTS NUMBER, 
    WCA_TOTAL_PTS  NUMBER, 
    WCA_TITLE   VARCHAR2(50 BYTE) 
) 

Я хочу обновить любую запись, где я отправляю тот же WCA_TNA_RID и WCA_REG_RID комбинацию, которая уже существует в противном случае, я хочу, чтобы вставить новая запись. У меня есть последовательность на WCA_RID

Означает ли это, что это будет трюк или может быть лучше?

CREATE OR REPLACE procedure CIC3.f_savewbpoints(pParticipantID number, pRegRid number, pAnsweredPoints number, pTotalPoints number, pTitle VARCHAR2) is 
    vWcaRid number; 
begin  
    SELECT DISTINCT wca_rid INTO vWcaRid 
    FROM wbcourseactivity 
    WHERE wca_reg_rid = pRegRid 
     AND wca_tna_id = pParticipantID; 

    UPDATE wbcourseactivity 
    SET wca_answered_pts = pAnsweredPoints 
     , wca_totalPts = pTotalPoints 
     , wca_title = pTitle 
    WHERE wca_rid = vWcaRid 
    IF (NVL(SQL%ROWCOUNT, 0) = 0) THEN 
      INSERT INTO wbcourseactivity (wca_tna_id 
             , wca_reg_rid 
             , wca_answered_pts 
             , wca_total_pts 
             , wca_title) 
      VALUES 
             (pParticipantID 
             , pRegRid 
             , pAnsweredPoints 
             , pTotalPoints 
             , pTitle); 
    END IF; 
    commit; 
end; 
/
+0

кстати 'IF (NVL (SQL% ROWCOUNT, 0) = 0)' можно упростить 'если SQL% ROWCOUNT = 0 '. Он не может иметь значение null, следующее за оператором SQL. –

ответ

2

Вы можете использовать MERGE:

CREATE OR REPLACE procedure CIC3.f_savewbpoints(pParticipantID number, pRegRid number, pAnsweredPoints number, pTotalPoints number, pTitle VARCHAR2) is 
begin 
    merge into wbcourseactivity a 
    using (
     SELECT DISTINCT wca_rid, wca_reg_rid, wca_tna_id 
     FROM wbcourseactivity 
     WHERE wca_reg_rid = pRegRid 
     AND wca_tna_id = pParticipantID; 
    ) b on (
     a.wca_rid = b.wca_rid 
     and a.wca_reg_rid = b.wca_reg_rid 
     and a.wca_tna_id = b.wca_tna_id 
    ) 
    when matched then update set a.wca_answered_pts = pAnsweredPoints 
    when not matched then insert (wca_tna_id, wca_reg_rid, wca_answered_pts, wca_total_pts, wca_title) 
         values (pParticipantID, pRegRid, pAnsweredPoints, pTotalPoints, pTitle); 
    commit; 
end; 
/
+0

Пробовал, он не сработал. Функция, которую я написал, отлично работает с несколькими трюками. Если вы не возражаете, я дам вам все равно. – MB34