使用普通用户写存储过程加密报错
- 解决方式
登录sys用户执行 grant execute on dbms_crypto to 用户
这样就完美解决,普通用户使用创建加密存储过程报错问题
--解码方法
CREATE OR REPLACE FUNCTION F_DECRYPT_NUMBER(ENCRYPTED_RAW IN RAW)
RETURN VARCHAR2 IS
DECRYPT_RAW RAW(48);
--KEY_NUMBER NUMBER(32) := 12345746456456454;
KEY_NUMBER VARCHAR2(32) := '12456789';
KEY_RAW RAW(128) := UTL_RAW.CAST_TO_RAW(KEY_NUMBER);
-- KEY_RAW RAW(128) := UTL_RAW.CAST_FROM_NUMBER(KEY_NUMBER);
BEGIN
DECRYPT_RAW := DBMS_CRYPTO.DECRYPT(SRC => ENCRYPTED_RAW,
TYP => DBMS_CRYPTO.DES_CBC_PKCS5,
KEY => KEY_RAW);
RETURN UTL_I18N.RAW_TO_CHAR(DECRYPT_RAW, 'AL32UTF8');
END;
--加密方法
CREATE OR REPLACE FUNCTION F_ENCRYPT_NUMBER(NUMBER_IN IN VARCHAR2)
RETURN RAW IS
NUMBER_IN_RAW RAW(128) := UTL_I18N.STRING_TO_RAW(NUMBER_IN, 'AL32UTF8');
KEY_NUMBER VARCHAR2(32) := '123456789';
-- KEY_RAW RAW(128) := UTL_RAW.CAST_FROM_NUMBER(KEY_NUMBER);
KEY_RAW RAW(128) := UTL_RAW.CAST_TO_RAW(KEY_NUMBER);
ENCRYPTED_RAW RAW(128);
BEGIN
ENCRYPTED_RAW := DBMS_CRYPTO.ENCRYPT(SRC => NUMBER_IN_RAW,
TYP => DBMS_CRYPTO.DES_CBC_PKCS5,
KEY => KEY_RAW);
RETURN ENCRYPTED_RAW;
END;
第二步 测试(以上使用sqlplus是能正常显示的,用navicat乱码)
加密:select F_ENCRYPT_NUMBER(‘123456’) from dual;
解密:select F_DECRYPT_NUMBER(F_ENCRYPT_NUMBER(‘123456’)) from dual;
1.第一步确认服务端使用的字符集
使用select userenv(‘language’) from dual;命令查询服务端字符集
2.第二步配置客户端字符集
- 将客户端的字符集配置成与服务端字符集一致
- 比如确认服务端字符集为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
- 通编辑数据库连接,在高级选项中,选择对应的客户端字符集及编码
关于乱码问题大家可以用上面的方法去解决,由于本人多次更改编码,没有更改成功。希望大家更改成功的可以留在评论区的连接。