在Informix的存储过程中使用MERGE语句

时间:2014-01-09 15:44:21

标签: informix

我有一个这样的存储过程:http://tinyurl.com/pbk8qfb

CREATE PROCEDURE PS_TAB_TSEN(NOMFIC VARCHAR(70), LIBSEN VARCHAR(35),
                             CODAPPFOF VARCHAR(3))

    DEFINE NUMINTNAV VARCHAR(10);

    BEGIN;

    LET NUMINTNAV = '0';
    SELECT TO_CHAR(NUM_INT_NAV) INTO NUMINTNAV
      FROM TAB_INAV WHERE NOM_FIC = NOMFIC;

    MERGE INTO TAB_TSEN T
    USING (SELECT COD_SEN, LIBSEN AS LIB_SEN, CODAPPFOF AS COD_APP_FOF 
             FROM TAB_TSEN 
            WHERE COD_SEN = NUMINTNAV) AS S
    ON (T.COD_SEN = S.COD_SEN)
    WHEN MATCHED THEN
            UPDATE SET T.COD_SEN = S.COD_SEN, T.LIB_SEN = S.LIB_SEN,
                       T.COD_APP_FOF = S.COD_APP_FOF
    WHEN NOT MATCHED THEN 
            INSERT (T.COD_SEN, T.LIB_SEN, T.COD_APP_FOF)
            VALUES (S.COD_SEN, S.LIB_SEN, S.COD_APP_FOF);

    COMMIT;

END PROCEDURE;

当我运行它时一切都很好,但当我在表中检查时,我看到没有结果,对于insert语句和update语句也是如此。

我称之为:

CALL PS_TAB_TSEN('~/PSS/Order/OrderList.aspx', 'Liste des commandes', 'NET');

我不明白发生了什么......

1 个答案:

答案 0 :(得分:1)

问题解决了,我用这个替换了我的存储过程:

CREATE PROCEDURE PS_TAB_TSEN(NOMFIC VARCHAR(70), LIBSEN VARCHAR(35), CODAPPFOF VARCHAR(3))
    DEFINE ISPRESENT INTEGER;
    DEFINE NUMINTNAV VARCHAR(10);

    BEGIN;

    LET NUMINTNAV = '0';
    SELECT TO_CHAR(NUM_INT_NAV) INTO NUMINTNAV FROM TAB_INAV WHERE NOM_FIC = NOMFIC;
    LET ISPRESENT = 0;
    SELECT COUNT(*) INTO ISPRESENT FROM TAB_TSEN WHERE COD_SEN = NUMINTNAV;

    IF(ISPRESENT > 0) THEN
        UPDATE TAB_TSEN SET T.COD_SEN = S.COD_SEN, T.LIB_SEN = S.LIB_SEN, T.COD_APP_FOF = S.COD_APP_FOF
    ELSE
        INSERT INTO TAB_TSEN (T.COD_SEN, T.LIB_SEN, T.COD_APP_FOF) VALUES (S.COD_SEN, S.LIB_SEN, S.COD_APP_FOF);
    END IF;

    COMMIT;

END PROCEDURE;