oracle数据库存储过程success with compilation error (oracle数据库字段加密解密)

2023-05-16

使用普通用户写存储过程加密报错

  1. 解决方式

登录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
  • 通编辑数据库连接,在高级选项中,选择对应的客户端字符集及编码

在这里插入图片描述

关于乱码问题大家可以用上面的方法去解决,由于本人多次更改编码,没有更改成功。希望大家更改成功的可以留在评论区的连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle数据库存储过程success with compilation error (oracle数据库字段加密解密) 的相关文章

随机推荐