在sql中频繁使用的功能(逻辑、加密等)可以写成自定义函数进行封装,之后再调用即可。

CREATE OR REPLACE FUNCTION "函数名" (参数名 参数类型 参数数据类型)
RETURN 返回值类型
AS
--定义变量
BEGIN
--PL-SQL语句块
RETURN 返回值
END;
/* 其中参数类型包括
in参数类型:表示输入给函数的参数,该参数只能用于传值,不能被赋值。
out参数类型:表示参数在函数中被赋值,可以传给函数调用程序,该参数只能用于赋值,不能用于传值。
in out参数类型:表示参数既可以传值,也可以被赋值。
*/

调用

SELECT 函数名(参数) FROM DUAL;

例子:创建自定义函数对表的指定字段进行加密。

使用了ORACLE的DBMS_CRYPTO包,需要注意一下两点:

1、DBMS_CRYPTO包是10g才有的,如果在10g以前的版本,使用DBMS_OBFUSCATION_TOOLKIT包;

2、DBMS_CRYPTO默认只有SYSDBA用户才可执行,所以其他的任何用户都需要SYSDBA进行赋权。



如图中可以看到ENCRYPT函数的参数:

1、src:需要加密的内容,但是需要转换为RAW格式,不能直接对VARCHAR2格式加密

2、typ:加密类型,由DBMS_CRYPTO定义,固定值

3、key:加密的秘钥

4、iv:block密码的选项,一般都置为默认,默认为null

下图为加密算法常量:



ENCRYPT_DES:标准数据加密。有效的键长度为56位,

ENCRYPT_3DES_2KEY:修改过的3DES,用两个密钥对每个数据块加密3次。有效的键长度为112位。

ENCRYPT_3DES:对每一个数据块加密3次。有效的键长度为156位。

ENCRYPT_AES128:高级加密标准。有效的键长度为128位。

ENCRYPT_AES192:高级加密标准。有效的键长度为192位。

ENCRYPT_AES256:高级加密标准。有效的键长度为256位。

ENCRYPT_RC4:唯一一个流加密,它被用于加密数据流,而不是离散数据或是表态数据。

DBMS_CRYPTO包的填充常量:

PAD_PKCS5:用PKCS#5填充。

PAD_ZERO:用零填充。

PAD_NONE:不进行填充,如果假设数据块的长度正好是8个字节,则可以使用这个方法。

DBMS_CRYPT0包的连接常量:

CHAIN_CBC:密码块连接,是最常用的方法。

CHAIN_CFB:加密反馈模式。

CHAIN_ECB:电子源码书格式。

CHAIN_OFB:输入回馈模式。

加密函数

    CREATE OR REPLACE FUNCTION "RETURN_ENCRYPTED_DATA" (入参 IN VARCHAR)
RETURN RAW IS
key VARCHAR(16) := '密钥';
encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 +
DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
RETURN DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(入参),
encryption_mode,
UTL_I18N.STRING_TO_RAW(key));
END;
--此函数将密钥固定了,也可将密钥定义为入参
--直接RETURN_ENCRYPTED_DATA(入参)即可调用

与上面对应的解密。

CREATE OR REPLACE FUNCTION "RETURN_ENCRYPTED_DATA" (入参 IN VARCHAR)
RETURN RAW IS
key VARCHAR(16) := '密钥';
encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 +
DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
RETURN DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(入参),
encryption_mode,
UTL_I18N.STRING_TO_RAW(key));
END;

之后还可创建触发器在插入和更新加密字段时调用自定义加密函数。

Oracle自定义函数&加密的更多相关文章

  1. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  2. 【转】Oracle 自定义函数语法与实例

    原文地址:https://blog.csdn.net/libertine1993/article/details/47264211 Oracle自定义函数的语法如下: create or replac ...

  3. Oracle自定义函数和存储过程示例,自定义函数与存储过程区别

    参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...

  4. Oracle自定义函数1

    用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其中,value被称为参数.函数参数有3种类型. IN 参数类型:表示输入给函数的参数 ...

  5. Oracle自定义函数

    核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...

  6. oracle自定义函数:将使用点分隔符的编码转成层级码格式的编码

    维护一个旧的系统,表设计中只有编码,而没有其他排序相关的字段,然后根据编码排序出现了顺序错乱的问题. 详细地说,其编码设计是使用[.]分隔符的编码,比如1.1.1.1.1.1.1.1.1.2这样的格式 ...

  7. Oracle 自定义函数实现列转行效果

    在 Oracle 领域,我相信一说到列转行大部分人都会立马想到 WM_CONCAT 函数,我觉得主要是因为该函数比较实用.但事实上 WM_CONCAT 并非官方公开函数,使用会存在一定的风险:函数返回 ...

  8. Oracle 自定义函数Function

    示例代码: CREATE OR REPLACE  FUNCTION "MY_DATABASE"."F_GET_USER_COUNT_BY_DEPART" ( D ...

  9. oracle 自定义函数

    函数和存储过程类似,可以简单的理解为一段可以执行某个活动/动作的子程序,可以作为一个系统对象被存储在数据库中,可以重复调用.与存储过程不同的是,函数总是向调用者返回一个值,而存储过程不能有返回值. C ...

随机推荐

  1. MySQL 5.7.16 在CentOS 6.5 x64 安装

    1.创建MySQL组和MySQL用户   # groupadd mysql   # useradd -g mysql mysql2.创建MySQL软件安装路径/opt/software   # mkd ...

  2. c#中的classes和objects一些知识【1】

    首先我们需要知道面向对象语言(Object-oriented language)的三大特点:封装(Encapulation),继承(Inheritance),多态(Polymorphism). 引言: ...

  3. MVC软件设计模式

    Model(模型):负责数据维护 View(视图):负责向用户呈现数据 Control(控制):负责模型和视图之间的交互 应用:Struts就是基于MVC模式的架构

  4. EOFError: Compressed file ended before the end-of-stream marker was reached

    EOFError: Compressed file ended before the end-of-stream marker was reached python在下载时,出现上述错误提示,一般这种 ...

  5. sql查询字段中的值长度最大的记录

    SELECT max(length(字段)) FROM 表名;

  6. C#之集合

    数组(http://www.cnblogs.com/afei-24/p/6738128.html)的大小是固定的.如果元素的个数是动态的,就应使用集合类. 列表(http://www.cnblogs. ...

  7. springboot 头像上传 文件流保存 文件流返回浏览器查看 区分操作系统 windows 7 or linux

    //我的会员中心 头像上传接口 /*windows 调试*/ @Value("${appImg.location}") private String winPathPic; /*l ...

  8. restsharp 组件调用返回 gbk 编码的api,中文乱码解决方法。(restsharp response 中文乱码 gbk)

    最近要调一个restful风格的api 用了 一个开源第三方组件,组件还是蛮好用的, 支持直接按参数定义实体类,然后发起请求之前直接 addobject 的方式就把请求参数给添加进去了, 解码的时候可 ...

  9. 【转】常用算法复习及实现(C++版)

    一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...

  10. Robot Framework自动化测试一(第一个脚本)

    创建测试项目                                           选择菜单栏file----->new Project Name 输入项目名称,Type 选择Di ...