Oracle自定义函数&加密
在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自定义函数&加密的更多相关文章
- Mybatis下配置调用Oracle自定义函数返回的游标结果集
在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...
- 【转】Oracle 自定义函数语法与实例
原文地址:https://blog.csdn.net/libertine1993/article/details/47264211 Oracle自定义函数的语法如下: create or replac ...
- Oracle自定义函数和存储过程示例,自定义函数与存储过程区别
参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...
- Oracle自定义函数1
用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其中,value被称为参数.函数参数有3种类型. IN 参数类型:表示输入给函数的参数 ...
- Oracle自定义函数
核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...
- oracle自定义函数:将使用点分隔符的编码转成层级码格式的编码
维护一个旧的系统,表设计中只有编码,而没有其他排序相关的字段,然后根据编码排序出现了顺序错乱的问题. 详细地说,其编码设计是使用[.]分隔符的编码,比如1.1.1.1.1.1.1.1.1.2这样的格式 ...
- Oracle 自定义函数实现列转行效果
在 Oracle 领域,我相信一说到列转行大部分人都会立马想到 WM_CONCAT 函数,我觉得主要是因为该函数比较实用.但事实上 WM_CONCAT 并非官方公开函数,使用会存在一定的风险:函数返回 ...
- Oracle 自定义函数Function
示例代码: CREATE OR REPLACE FUNCTION "MY_DATABASE"."F_GET_USER_COUNT_BY_DEPART" ( D ...
- oracle 自定义函数
函数和存储过程类似,可以简单的理解为一段可以执行某个活动/动作的子程序,可以作为一个系统对象被存储在数据库中,可以重复调用.与存储过程不同的是,函数总是向调用者返回一个值,而存储过程不能有返回值. C ...
随机推荐
- 自己实现一个shell
用C实现一个简单的交互式shell,要求:当用户输入一行命令时,识别程序名和参数并调用适当的exec函数执行程序,等待执行完成后给出提示符. exec函数实际上是六种以exec开头的函数,统称exec ...
- linux和windows之间的文件压缩和解压缩以及^R的问题
推荐大家使用zip压缩和解压,因为zip一般是linux系统自带: 一.zip和unzip 1. zip压缩 zip -r myfile.zip ./web 将当前目录里的web下的所有文件和文件夹全 ...
- ie下的值改变事件
前两天在页面上写了一个值改变事件,值是用js改变的,用的oninput方法和onpropertyChange方法,但是可能是因为框架的缘故,在ie浏览器下,陷入了莫名其妙的循环中.然后考虑是在加载的时 ...
- EntityFrameworkCore 数据库生成与迁移
EntityFrameworkCore code first 中数据库不再自动生成,而要手动执行数据迁移相关命令生成. 由于云数据库的安全限制,没有开放公网数据库远程连接端口导致数据库生成命令无法执行 ...
- Linux 系统下安装 mysql5.7.25(glibc版)
前言:经过一天半的折腾,终于把 mysql 5.7.25 版本安装上了 Amazon Linux AMI release 2017.09 系统上,把能参考的博客几乎都看了一遍,终于发现这些细节问题,然 ...
- javascript DOM相关语法
childNodes: 获取元素内的所有节点 包括文本节点:nodeType=3 , 元素节点:nodeType = 1 nodeType:它可以判断所有节点的类型 元素节点类型:1 文本节点:3 注 ...
- 浏览器获取WEB服务器时间
/* * 获取XMLHttpRequest对象 */ function CreateXMLHttpRequest() { var xmlreq = false; if (window.ActiveXO ...
- selenium+Python(事件)
1.操作测试对象前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作.鼠标点击或者键盘输入,这要取决于我们定位的是按钮还输入框.一般来说,webdriver 中比较常用的操作 ...
- JDBC(5)-处理大数据
大数据对象处理主要有CLOB(character large object) 和BLOB(binary large object) 两种类型的字段. 在CLOB中可以存储大字符对象,比如长篇小说:在B ...
- HtmlUnit 开发网络爬虫
网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,几行代码就OK啦! 通常在一个页面中会包含别的Url,在别的Url当中又会包含更多的Url. ...