weixin_44253871
Lee
2021-01-22 22:25

oracle 存储过程同步同步数据,decode不能返回正确值

  • oracle

近期在oracle项目中做了一个用户同步的存储过程,但是在同步用户关联的相关子表的时候出现用户状态同步错误。

存储过程代码如下

CREATE OR REPLACE PROCEDURE SYNC_USER IS
  -- 创建存储过程 如果是脚本 去掉上面加上 DECLARE
  CURSOR C_USER IS
    select u.*, o.name, o.CODE
      from sys_user u
      left join sys_organ o
        on u.organ_id = o.id
     where u.ORGAN_ID is not null
       and u.NICK_NAME is not null;
  -- 声明变量
  V_USER C_USER%ROWTYPE; --表示游标中一行数据
  V_CT   NUMBER(5);
  V_TEMP VARCHAR2(255);
BEGIN
  update SYS_USER set nick_name = username where NICK_NAME is null;
  FOR V_USER IN C_USER LOOP
    --遍历C_USER把每次循环的值赋给V_USER
    SELECT COUNT(1) INTO V_CT FROM s_user@LINK_CATSIC WHERE ID = V_USER.ID; -- 通过用户名 判断数据是否存在于目标表
    IF V_CT = 1 THEN
      -- 如果存在则用源表中的数据更新目标表 不存在则插入数据
      UPDATE s_user@LINK_CATSIC u
         SET u.USERNAME       = V_USER.USERNAME,
             u.PASSWORD       = V_USER.PASSWORD,
             u.REALNAME       = V_USER.NICK_NAME,
             u.OID            = V_USER.ORGAN_ID,
             u.CREATE_TIME    = V_USER.CREATE_TIME,
             u.STAFF_PARTNER1 = V_USER.MINISTERIAL,
             u.STAFF_PARTNER2 = V_USER.PROVINCIAL,
             u.STATUS         = decode(V_USER.STATUS, 0, '激活', 1, '冻结'),
             u.MOBILE         = V_USER.MOBILE
       WHERE u.ID = V_USER.ID;
    ELSIF V_CT = 0 THEN
      INSERT INTO s_user@LINK_CATSIC
        (ID,
         USERNAME,
         PASSWORD,
         CREATE_TIME,
         REALNAME,
         OID,
         MOBILE,
         STATUS,
         STAFF_PARTNER1,
         STAFF_PARTNER2)
      VALUES
        (V_USER.ID,
         V_USER.USERNAME,
         V_USER.PASSWORD,
         V_USER.CREATE_TIME,
         V_USER.NICK_NAME,
         V_USER.ORGAN_ID,
         V_USER.MOBILE,
         decode(V_USER.STATUS, 0, '激活', 1, '冻结'),
         V_USER.MINISTERIAL,
         V_USER.PROVINCIAL);
    END IF;
    select NVL(PROVINCIAL, MINISTERIAL)
      into V_TEMP
      from sys_user
     where ID = V_USER.ID;
    IF (V_TEMP IS NOT NULL) THEN
      INSERT INTO CASE_STAFF@LINK_CATSIC
        (CASE_STAFF_ID,
         STAFF_CERTIFICATEID,
         ORGAN_ID,
         ORGAN_CODE,
         ORGAN_NAME,
         STAFF_NAME,
         STATUS)
      VALUES
        (V_USER.ID,
         NVL(V_USER.PROVINCIAL, V_USER.MINISTERIAL),
         V_USER.ORGAN_ID,
         V_USER.code,
         V_USER.name,
         V_USER.nick_name,
         decode(V_USER.STATUS, 0, '激活', 1, '冻结'));
    END IF;
  END LOOP;
  COMMIT;
END;

在实际执行过程中更新已有账户和同步增量用户的代码采用decode都能正常显示状态信息(因为两边用于显示状态的值有所不同,A库用0,1代表用户激活或冻结的状态,B库用激活、冻结汉字代表状态,因此需要decode转译)

执行存储过程后B库用户表(s_user)状态结果如下:

但B库人员表(case_staff)状态则如下

请问各位大神,同样的decode写法,为啥同步后两个表返回的结果不一样呢?

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

0条回答

为你推荐