Lee 2021-01-22 22:25 采纳率: 0%
浏览 22

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

近期在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写法,为啥同步后两个表返回的结果不一样呢?

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-14 23:34
    关注

    首先需要确认一下两个表的状态列的数据类型是否一致,例如一个是数字类型,一个是字符类型。此外,可能存在一些数据上的差异,导致decode无法正确转译,建议检查一下两个表之间的数据差异以及存储过程中使用的条件语句和变量是否正确。另外,使用CASE语句也是一种更加可靠的转译方式,建议在存储过程中尝试使用。

    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献