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