Oracle数据库中instr函数的使用

INSTR(C1,C2,I,J) 

在一个字符串中搜索指定的字符,返回发现指定的字符的位置;

C1 被搜索的字符串 
C2 希望搜索的字符串 
I 搜索的开始位置,默认为1 
J 出现的位置,默认为1 

SELECT instr('hello world','world') FROM dual;

还可用于代替like,并使模糊更强大

在我们使用like时一般都是:
已知字段 like 关键字

如果反过来呢
例如我有一个地址:A省B市C区D街xxx号

数据库中有一个表Table,已知字段:
A:省
B:市
C:区
D:街
E:地区信息

那么我怎么通过已知地址获取到E字段的信息?

引用instr函数实现:
select E from table 
where
instr('A省B市C区D街xxx号',A)>1
and instr('A省B市C区D街xxx号',B)>1
and instr('A省B市C区D街xxx号',C)>1
and instr('A省B市C区D街xxx号',D)>1

Oracle修改表字段类型报错

错误信息:
[Err] ORA-22858: invalid alteration of datatype

原因:
oracle对该字段类型进行了限制

解决方案:
1.删除掉该字段保存
2.重新添加该字段并设置为想要修改的值
相关java错误信息:
ORA-01461:仅可以插入LONG列的LONG值赋值

原因:
字段类型错误导致数据无法添加

解决方案:
举例:
原字段类型为varchar2改为clob文本类型

SpringBatch读取excel异常

摘取关键报错信息:
1.Failed to initialize the reader
2.Failed to find end of row/cell records
3.Step failure: the delegate Job failed in JobStep.

根据异常信息可以得出,引起异常的原因为读取文件时有空行或空列出现
此处以excel为例:
解决途径:
1.Ctrl+A查看覆盖范围是否超出有效值部分
例如有效列只有1列,Ctrl+A后覆盖了两列,那么第二列就是引起错误的原因
清空第二列的内容重新执行
2.如没有1中情况或1中无效
复制有效值到新建excel中并对新建excel进行批处理操作

Oracle同步A表某字段值到B表某字段

-- 查询两字段值
select A.ITEM,B.ITEM from TABLE_A A 
LEFT JOIN TABLE_B B ON A.NAME=B.NAME
-- WHERE B.ITEM IS NOT NULL
;
--同步B表字段值到A表
UPDATE TABLE_A A
SET A.ITEM =(
select B.ITEM from TABLE_B B 
WHERE A.NAME=B.NAME
);

--将A表中多个字段值映射到B表多个对应字段
UPDATE TABLE_A A
SET (A.ITEM,A.ITEM_2) =(
select B.ITEM,B.ITEM_2 from TABLE_B B 
WHERE A.NAME=B.NAME
);

Java实现字段脱敏处理

     /**
     * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>
     *
     * @param fullName
     * @return
     */
    public static String chineseName(String fullName) {
        if (StringUtils.isBlank(fullName)) {
            return "";
        }
        String name = StringUtils.left(fullName, 1);
        return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
    }

    /**
     * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>
     *
     * @param familyName
     * @param givenName
     * @return
     */
    public static String chineseName(String familyName, String givenName) {
        if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
            return "";
        }
        return chineseName(familyName + givenName);
    }

    /**
     * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
     *
     * @param id
     * @return
     */
    public static String idCardNum(String id) {
        if (StringUtils.isBlank(id)) {
            return "";
        }
        String num = StringUtils.right(id, 4);
        return StringUtils.leftPad(num, StringUtils.length(id), "*");
    }

    /**
     * [固定电话] 后四位,其他隐藏<例子:****1234>
     *
     * @param num
     * @return
     */
    public static String fixedPhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
    }

    /**
     * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
     *
     * @param num
     * @return
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
    }

    /**
     * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
     *
     * @param address
     * @param sensitiveSize
     *            敏感信息长度
     * @return
     */
    public static String address(String address, int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    }

    /**
     * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>
     *
     * @param email
     * @return
     */
    public static String email(String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        if (index <= 1) {
            return email;
        }else{
            return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
    }

    /**
     * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
     *
     * @param cardNum
     * @return
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    }

    /**
     * [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>
     *
     * @param code
     * @return
     */
    public static String cnapsCode(String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }
        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    }

重写权限系统

之前权限系统基于ColaUI和BDF2,现在其基础上进行改造

要求:
1.实现资源控制和权限控制
2.用户依据角色资源和权限,实现用户级资源和权限递减
3.资源控制主要控制页面和组件
4.权限主要控制数据层

重写部分:
角色表
角色页面表
角色页面组件表
角色权限表
用户页面表
用户页面组件表
用户权限表

角色表用于保存角色的基本信息
角色页面表用于保存该角色可查看的页面信息(基于菜单表递减)
角色页面组件表用于保存该角色可查看的页面内的组件信息(基于组件表递减)
角色权限表用于保存该角色可操作的数据信息(基于该账号所属机构现有数据的某些字段值递减)

用户页面表用于保存该用于不可看的页面信息(基于角色页面表)
用户页面组件表同上取反
用户权限表用于保存该用户可看的数据(基于角色权限表)

A表基于B表,则A表的值最大为B表的值

这些表的增删改并不是重点,重点是将设置的值接入系统

接入点:
1.用户登录后获取角色及其对应的菜单项(版本替换过程中还需保证不影响原来的权限系统)
2.点击菜单加载对应的页面信息时(页面权限判断)
3.页面加载时组件的过滤(组件权限的判断)
4.数据请求时数据的过滤(数据权限的判断)

注意:
1.页面组件及数据权限过滤时接口全都基于用户查询
2.菜单加载时需考虑对原系统的影响,避免线上系统出现问题
3.页面权限判断深入框架内部,需修改jar包实现接入;
  如没有找到接口,可暂将资源设置的结果集映射的原系统表进行替代
4.组件权限过滤已在“ColaUI组件过滤”中提出,可替换其查询路径进行接口替换
5.数据过滤基于账号所属机构,主要在Dao层进行限定

ColaUI组件过滤设置

ColaUI配合后端BDF2框架共同实现组件级权限控制

在请求页面资源时通过js代码对页面进行权限过滤
<!--测试组件-->
<div id='test'></div>
(function() {
	cola(function(model) {
        var role_resource_data={
            url:'/html/test.html',
            ids:['test']
        };
    //其它代码
    App.resetComponentAuth(role_resource_data);
  });
}).call(this);
注意事项:
1.对应id组件上方如果不加注释,那么在进行角色组件资源设置时显示的是id;
  添加注释后则显示注释中的内容
2.url对应值为要控制的页面路径,从webapp下开始写
3.ids为要控制的页面中的id组件集合,不写入则组件控制无效
4.在其他代码部分不能出现return,例如return model.widgetConfig({...});
  否则代码不执行最后一行,无法进行组件过滤
5.最后一行代码进行了数据库访问,对组件权限信息进行获取,并刷新页面