2016-03-08 3 views
0

Я изо всех сил пытаются сделать эту процедуру, чтобы работать, у меня есть следующий код в моем теле пакета:Oracle Объединить ошибки заявление в процедуре тела пакета

PACKAGE BODY PKG_DM_TRANS_DIMENSIONES AS 

      PROCEDURE SP_DM_TRANS_DIM_CUENTA AS 

     vNumRegistrosDimCuentas NUMBER; 

      BEGIN 
      SELECT COUNT(*) INTO vNumRegistrosDimCuentas 
      FROM DIM_CUENTAS; 

      IF (vNumRegistrosDimCuentas <> 0) THEN 

       MERGE INTO DIM_CUENTAS DIMC 
       USING (
       SELECT * FROM (
        SELECT 
        DIM.FNT_CUENTA_ID AS DIM_CUENTA_ID, 
        C.CUE_ID AS FNT_CUENTA_ID, 
        R.REG_REGION AS REGION, 
        P.PAI_PAIS AS PAIS, 
        E.EDI_NOMBRE_EDIFICIO AS EDIFICIO, 
        C.CUE_CUENTA, 
        TIC.TIC_TIPO_CONTACTO, 
        C.CUE_STATUS, 
        CASE 
         WHEN DIM.FNT_CUENTA_ID IS NULL THEN 1 
         WHEN 
         R.REG_REGION <> DIM.REGION OR 
         P.PAI_PAIS <> DIM.PAIS OR 
         E.EDI_NOMBRE_EDIFICIO <> DIM.EDIFICIO OR 
         C.CUE_CUENTA <> DIM.CUENTA OR 
         TIC.TIC_TIPO_CONTACTO <> DIM.TIPO_CONTACTO 
         THEN 2 
         ELSE 0 
        END AS TIPO_FILA 

        FROM STA_EDIFICIOS_EXTRACCION E 

        LEFT JOIN 
        STA_PAISES_EXTRACCION P ON E.EDI_PAI_ID = P.PAI_ID 
        LEFT JOIN 
        STA_REGIONES_EXTRACCION R ON P.PAI_REG_ID = R.REG_ID 
        LEFT JOIN 
        EUB_EDIFICIO_UBICACION EUB ON EUB.EUB_EDI_ID = E.EDI_ID 
        LEFT JOIN 
        STA_CUENTAS_EXTRACCION C ON C.CUE_EUB_ID = EUB.EUB_ID 
        LEFT JOIN 
        STA_TIPOS_CONTACTO_EXTRACCION TIC ON TIC.TIC_ID = C.CUE_TIC_ID 
        LEFT JOIN 
         DIM_CUENTAS DIM ON 
        (C.CUE_ID = DIM.FNT_CUENTA_ID AND DIM.CUENTA_STATUS = 1) 
       ) 
      ) Q 
       ON (DIMC.FNT_CUENTA_ID = Q.TIPO_FILA) 
       WHEN MATCHED THEN 
       INSERT (DIMC.REGION, DIMC.PAIS, DIMC.EDIFICIO, DIMC.CUENTA, DIMC.TIPO_CONTACTO, DIMC.CUENTA_FECHA_CREACION, DIMC.FNT_CUENTA_ID) 
       VALUES (Q.REGION, Q.PAIS, Q.EDIFICIO, Q.CUE_CUENTA, Q.TIC_TIPO_CONTACTO, TO_TIMESTAMP(sysdate, 'MM/DD/YYYY HH24:MI:SS'), Q.FNT_CUENTA_ID) 
       WHEN NOT MATCHED THEN 

       UPDATE SET DIMC.CUENTA_STATUS = 0 WHERE DIMC.CUENTA_STATUS = 1 -- <- dummy update stmt 

      ELSE ..... -- else statement code working fine... 
     END IF; 
     END SP_DM_TRANS_DIM_CUENTA; 

END PKG_DM_TRANS_DIMENSIONES; 

Я получаю erros на линии

MERGE INTO DIM_CUENTAS DIMC 

Высказывание "Заявление игнорировали"

, а затем, другая ошибка в:

INSERT (DIMC.REGION, DIMC.PAIS, DIMC.EDIFICIO, DIMC.CUENTA, DIMC.TIPO_CONTACTO, DIMC.CUENTA_FECHA_CREACION, DIMC.FNT_CUENTA_ID) 
     VALUES (Q.REGION, Q.PAIS, Q.EDIFICIO, Q.CUE_CUENTA, Q.TIC_TIPO_CONTACTO, TO_TIMESTAMP(sysdate, 'MM/DD/YYYY HH24:MI:SS'), Q.FNT_CUENTA_ID) 

"Отсутствие ключевого слова". Можно ли использовать оператор слияния в SP? Я новичок в Oracle, поэтому я действительно не знаю, возможно ли то, что я пытаюсь сделать, или если что-то не так с моим кодом.

Спасибо за любую помощь, я бы очень ее воспринял.

ответ

0

Я думаю, что вы поменялись командами - после when matched вы должны поставить заявление update и после not matched - insert. Подобный пример работал для меня, но после обмена заявлениями я получил ORA-00905 missing keyword. Поэтому правильный вариант:

merge into t1 
using (select * from t2) t2 on (t1.id = t2.id) 
when matched then update set t1.name = t2.name 
when not matched then insert (id, name) values (t2.id, t2.name) 
+0

Большое вам спасибо! что сделал трюк :) – stigma