在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. JSR133规范学习

    最近在看多线程相关的东西,通过阅读JSR133的faq来加深自己对多线程的理解,里面大部分的内容比较简单(越到后面越难),但是有的部分比较难以理解还没有完全弄懂,所以这里只记录了一下比较简单的阅读笔记 ...

  2. iOS中的自由桥接

    [摘抄自<iOS 6编程实战>] 与Objective-C库不同,我们在Objective-C中使用标准C语言和Core Foundation类库(CF*方法)不会遵循那些命名约定.这意味 ...

  3. React.Children详解

    React.Children提供了处理this.props.children的工具,this.props.children可以任何数据(组件.字符串.函数等等).React.children有5个方法 ...

  4. ubuntu下面的某些软件安装

    1. python 下面的mysql驱动:不是在pip里面安装,执行下面命令 apt-get install python-mysqldb

  5. [转] iOS 在UILabel显示不同的字体和颜色

    在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串,在iOS 6 以后我们可以很轻松的实现这一点,官方的API 为我们提供了UILabel类的at ...

  6. 安装mysqlclient, 链接mysql失败,提示“Library not loaded: @rpath/libmysqlclient.21.dylib”

    问题: >>> import MySQLdb Traceback (most recent call last): File "<stdin>", l ...

  7. Git远程库

    要关联一个远程主机,使用命令 git remote add origin <url> : 删除远程主机,使用命令 git remote rm origin ; git push 的一般形式 ...

  8. QRegExp

    这段代码会越界,百思不得七姐(过了N久时间 之后^^)原来是把i写成了1  --! //#if 0 QRegExp re1("AT+CGATT?"); QRegExp re2(&q ...

  9. 01背包--hdu2639

    hdu-2639 The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rooki ...

  10. 剑指offer——面试题22:链表中倒数第k个节点

    注意代码的鲁棒性! 函数: ListNode* TheLastKthNode(ListNode* pHead,int k) { ) return nullptr; ListNode* quickNod ...