oracle 自定义函数
- 格式:docx
- 大小:23.05 KB
- 文档页数:1
oracle⾃定义字符串分割函数思路:oracle没有提供类似java中split的函数来将字符串分割成数组,需要开发者⾃⼰搞定.⾸先定⼀个数组类型,再定义⼀个函数或存储过程,处理字符串分割操作,⼀个具体的实例如下:--⾃定义数组类型:CREATE OR REPLACETYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);/--⾃定义字符串分割函数,返回分组后的数组CREATE OR REPLACE FUNCTION f_strsplit (STRING VARCHAR2, substring VARCHAR2)RETURN varchar2varrayISlen INTEGER := LENGTH (substring);lastpos INTEGER := 1 - len;pos INTEGER;num INTEGER;i INTEGER := 1;ret varchar2varray := varchar2varray (NULL);v_str VARCHAR2 (32767);/**⾃定义split函数,将指定的字符串按指定的标志符分割成字符数组*/BEGINLOOPpos := INSTR (STRING, substring, lastpos + len);IF pos > 0THEN --foundnum := pos - (lastpos + len);ELSE --not foundnum := LENGTH (STRING) + 1 - (lastpos + len);END IF;IF i > STTHENret.EXTEND;END IF;v_str := SUBSTR (STRING, lastpos + len, num);--DBMS_OUTPUT.put_line (v_str);ret(i) := v_str;EXIT WHEN pos = 0;lastpos := pos;i := i + 1;END LOOP;RETURN ret;END;/--调⽤⽅式:SELECT *FROM TABLE (CAST (f_strsplit ('ABC$DEFGH$IJKLMN$OPQRST', '$') AS varchar2varray ) )将输出:column_value--------------ABCDEFGHIJKLMNOPQRST也可以采⽤如下⽅式得到数组中的值FOR cur_str IN(SELECT *FROM TABLE(CAST(f_strsplit ('ABC$DEFGH$IJKLMN$OPQRST', '$') AS varchar2varray )))LOOPDBMS_OUTPUT.put_line (cur_str.column_value);--其他赋值操作END LOOP;转载⾃:。
ORACLE函数记录,⾃定义⽇历周获取周数函数:⾃定义⽇历周获取周数功能说明:计算某⽇期是⼀年的第⼏周,⽀持⾃定义⽇历周,将任意周内星期设为⼀周起始⽇。
参数说明:currentDate为⽬标⽇期,weekStandard为⾃定义⼀周开端。
注:可将任意周⽇、周⼀、周⼆...设为⼀周开头,参数取值范围为1~7,周⼀⽤1表⽰,周⼆⽤2表⽰,以此类推。
具体sql如下:CREATE OR REPLACE function GetWeekNum(currentDate IN date,weekStandard IN varchar2) return varchar2asfirstDayWeekNo NUMBER; --本年1号周⼏(以⽇历为基础,周⼀为第⼀天)fisrtWeekDayCount NUMBER; --本年第⼀周天数(以weekNo为标准)dayCount NUMBER; --总天数weekCount NUMBER; --总周数beginif currentDate is null or weekStandard is null or weekStandard < 1 or weekStandard > 7thenreturn null;end if;firstDayWeekNo := to_char(trunc(currentDate,'y'),'d','NLS_DATE_LANGUAGE=AMERICAN')-1;if firstDayWeekNo = 0thenfirstDayWeekNo := 7;end if;if weekStandard = firstDayWeekNothenif(currentDate = trunc(currentDate,'y'))thenfisrtWeekDayCount := 1;elsefisrtWeekDayCount := 7;end if;elsif weekStandard < firstDayWeekNothenfisrtWeekDayCount := 7-(firstDayWeekNo-weekStandard);elsif weekStandard > firstDayWeekNothenfisrtWeekDayCount := (weekStandard - firstDayWeekNo);end if;dayCount := to_char(currentDate,'ddd');weekCount := ceil((dayCount-fisrtWeekDayCount)/7)+1;return to_char(currentDate,'YYYY')||to_char(weekCount,'FM00');end;。
自定义聚合函数,分析函数--from GTA Aaron最近做一数据项目要用到连乘的功能,而Oracle数据库里没有这样的预定义聚合函数,当然利用数据库已有的函数进行数学运算也可以达到这个功能,如:select exp(sum(ln(field_name))) from table_name;不过今天的重点不是讲这个数学公式,而是如何自己创建聚合函数,实现自己想要的功能。
很幸运Oracle 允许用户自定义聚合函数,提供了相关接口,LZ研究了下,留贴共享。
首先介绍聚合函数接口:用户可以通过实现Oracle的Extensibility Framework中的ODCIAggregate interface 来创建自定义聚合函数,而且自定义的聚合函数跟内建的聚合函数用法上没有差别。
通过实现ODCIAggregate rountines来创建自定义的聚合函数。
可以通过定义一个对象类型(Object Type),然后在这个类型内部实现ODCIAggregate 接口函数(routines),可以用任何一种Oracle支持的语言来实现这些接口函数,比如C/C++, JAVA, PL/SQL等。
在这个Object Type定义之后,相应的接口函数也都在该Object Type Body内部实现之后,就可以通过CREATE FUNCTION语句来创建自定义的聚合函数了。
每个自定义的聚合函数需要实现4个ODCIAggregate 接口函数,这些函数定义了任何一个聚合函数内部需要实现的操作:1. 自定义聚合函数初始化操作,从这儿开始一个聚合函数。
初始化的聚合环境(aggregation context)会以对象实例(object type instance)传回给oracle.static function ODCIAggregateInitialize(var IN OUT agg_type ) return number 2. 自定义聚合函数,最主要的步骤,这个函数定义我们的聚合函数具体做什么操作,self 为当前聚合函数的指针,用来与前面的计算结果进行关联。
Oracle—⾃定义function语法(转载)⽤户⾃定义函数是存储在数据库中的代码块,可以把值返回到调⽤程序。
函数的参数有3种类型:(1)in参数类型:表⽰输⼊给函数的参数,该参数只能⽤于传值,不能被赋值。
(2)out参数类型:表⽰参数在函数中被赋值,可以传给函数调⽤程序,该参数只能⽤于赋值,不能⽤于传值。
(3)in out参数类型:表⽰参数既可以传值,也可以被赋值。
1.函数的创建语法格式:Sql代码1. create [or replace] function functionName2. (3. parameterName1 mode1 dataType1,4. parameterName2 mode2 dataType2,5. ...6. )7. return returnDataType8. is/as9. begin10. function_body11. return expression12. end functionName; -- 结束函数的声明,也可以直接写end不加函数名。
13. --其中mode1、mode2表⽰参数类型,dataType表⽰参数的数据类型。
returnDataType表⽰返回值类型。
⽰例1:Sql代码1. create or replace function explainParameter -- 定义⼀个名为explainParameter的函数2. (3. inParam in char, -- 定义该参数类型为in参数类型,只能⽤于赋值4. outParam out char, -- out参数类型,只能⽤于传值5. inAndOutParam in out char -- in out参数类型,既能赋值,⼜能传值6. )7. return char -- 表⽰函数的返回类型为char类型8. as -- 表⽰函数体部分9. returnChar char; -- 声明零时变量,这是可有可⽆的,这⾥声明返回变量为char类型的returnChar变量。
Oracle创建⾃定义函数--解析JSON字符串按照下⾯步骤在oracle 执⾏sql----------创建⾃定义函数sql—1.创建⼀个type,返回table类型CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2(4000);—2.创建⼀个分割的函数,主要对json进⾏按照固定割串分割CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_str_splitISj INT := 0;i INT := 1;len INT := 0;len1 INT := 0;str VARCHAR2 (4000);str_split ty_str_split := ty_str_split ();BEGINlen := LENGTH (p_str);len1 := LENGTH (p_delimiter);WHILE j < lenLOOPj := INSTR (p_str, p_delimiter, i);IF j = 0THENj := len;str := SUBSTR (p_str, i);str_split.EXTEND;str_split (str_split.COUNT) := str;IF i >= lenTHENEXIT;END IF;ELSEstr := SUBSTR (p_str, i, j - i);i := j + len1;str_split.EXTEND;str_split (str_split.COUNT) := str;END IF;END LOOP;RETURN str_split;END fn_split;—3.再创建⼀个函数,解析json对像{}CREATE OR REPLACE FUNCTION parsejson(p_jsonstr varchar2, p_key varchar2)RETURN VARCHAR2 ISrtnVal VARCHAR2(1000);i NUMBER(2);jsonkey VARCHAR2(500);jsonvalue VARCHAR2(1000);json VARCHAR2(3000);BEGINIF p_jsonstr IS NOT NULL THENjson := REPLACE(p_jsonstr, '{', '');json := REPLACE(json, '}', '');json := replace(json, '"', '');FOR temprow IN (SELECT * FROM TABLE(fn_split(json, ','))) LOOPIF temprow.column_value IS NOT NULL THENi := 0;jsonkey := '';jsonvalue := '';FOR tem2 IN (SELECT *FROM TABLE(fn_split(temprow.column_value, ':'))) LOOPIF i = 0 THENjsonkey := tem2.column_value;END IF;IF i = 1 THENjsonvalue := tem2.column_value;END IF;i := i + 1;END LOOP;IF (jsonkey = p_key) THENrtnVal := jsonvalue;END if;END IF;END LOOP;END IF;RETURN rtnVal;END parsejson;—4 解析JSON数组[{},{}]CREATE OR REPLACEFUNCTION parsejsontwo(p_jsonstr varchar2, p_key varchar2)RETURN VARCHAR2 ISrtnVal VARCHAR2(4000);i NUMBER(2);jsonkey VARCHAR2(500);jsonvalue VARCHAR2(1000);json VARCHAR2(4000);json2 VARCHAR2(4000);BEGINIF p_jsonstr IS NOT NULL THENjson := REPLACE(p_jsonstr, '[', '');json := REPLACE(json, ']', '');FOR temprow IN (SELECT * FROM TABLE(fn_split(json, ','))) LOOPIF temprow.column_value IS NOT NULL THENjson2 := REPLACE(temprow.column_value, '{', '');json2 := REPLACE(json2, '}', '');json2 := replace(json2, '"', '');FOR temprow2 IN (SELECT * FROM TABLE(fn_split(json2, ','))) LOOPi:=0;jsonkey:= '';jsonvalue:= '';FOR tmpe2 IN (SELECT * FROM TABLE(fn_split(temprow2.column_value, ':'))) LOOPIF i = 0 THENjsonkey := tmpe2.column_value;END IF;IF i = 1 THENjsonvalue := tmpe2.column_value;END IF;i := i + 1;END LOOP;IF (jsonkey = p_key) THENIF rtnVal IS NOT NULL THENrtnVal :=rtnVal||','||jsonvalue;ELSErtnVal :=jsonvalue;END IF;END if;END LOOP;END IF;END LOOP;END IF;RETURN rtnVal;END parsejsontwo;使⽤:SELECT parsejsontwo('[{"applyno":792,"extend1":"2019-WT-280","customerpart":"xxx","contactman":"茆XX","projectname":"XXXXX","projecttype":"XXX样"},{"applyno":793,"extend1":"2019-WT-281","customerpart":"江苏XXX集团有限公司","cont。
oracle⾃定义函数函数 函数与存储过程相似,也是数据库中存储的已命名PL-SQL程序块。
函数的主要特征是它必须有⼀个返回值。
通过return来指定函数的返回类型。
在函数的任何地⽅可以通过return expression语句从函数返回,返回类型必须和声明的返回类型⼀致。
语法: create[or replace]function function_name [(parameter_list)] return datatype {is/as} [local_declarations] begin executable_statements; [exception exception_handlers;] end;说明: function_name:函数名称。
parameter_list:函数列表,可选。
return ⾃居:指定函数的返回类型,不能指定⼤⼩。
local_declarations:局部变量声明,可选。
executable_statements:要执⾏的PL-SQL语句。
exception_handlers:异常处理,可选。
or repalce:是否覆盖,可选。
例:根据员⼯编号获得员⼯薪⽔。
--根据no查询salCREATE OR REPLACE FUNCTION fun_getSal(eno NUMBER)RETURN NUMBER--返回类型ASv_sal emp.sal%TYPE;BEGINSELECT sal INTO v_sal FROM emp WHERE empno = eno;RETURN v_sal;EXCEPTIONWHEN OTHERS THENraise_application_error(-20012,'该雇员不存在');END fun_getSal;调⽤函数:--调⽤函数,⾃定义异常处理DECLAREv_sal NUMBER;emp_20012 EXCEPTION;PRAGMA EXCEPTION_INIT(emp_20012,-20012);BEGINv_sal:=fun_getsal(7788);dbms_output.put_line('sal:'||v_sal);EXCEPTIONWHEN emp_20012 THENdbms_output.put_line('该雇员不存在');END;注意: 1、函数参数和返回类型只声明参数,不指定⼤⼩。
Oracle是一种常用的关系型数据库管理系统,它提供了丰富的函数和特性来支持开发人员创建有效的数据库应用程序。
其中,返回表类型的自定义函数是一种非常有用的功能,可以帮助开发人员简化复杂的查询,并方便地使用查询结果进行进一步的处理和分析。
在Oracle中,表类型是一种用户定义的复杂数据类型,可以包含多个字段,并且可以在查询中作为一种临时的数据结构来使用。
通过使用返回表类型的自定义函数,开发人员可以将复杂的查询逻辑封装到函数中,并且可以方便地在应用程序中调用这些函数来获取所需的数据。
下面我们将介绍如何在Oracle中创建和使用返回表类型的自定义函数。
1. 创建表类型在创建返回表类型的自定义函数之前,首先需要创建相应的表类型。
可以使用以下语句来创建一个包含多个字段的表类型:```sqlCREATE OR REPLACE TYPE person_type AS OBJECT (id NUMBER,name VARCHAR2(100),age NUMBER);```上面的语句创建了一个名为`person_type`的表类型,其中包含三个字段:`id`、`name`和`age`。
2. 创建自定义函数一旦表类型创建完成,接下来可以创建返回该表类型的自定义函数。
以下是一个简单的例子,演示了如何创建一个返回`person_type`表类型的自定义函数:```sqlCREATE OR REPLACE FUNCTION get_person_info RETURN person_typeISp person_type;BEGINSELECT person_type(id, name, age) INTO pFROM person_tableWHERE id = 1;RETURN p;END;```在上面的例子中,我们创建了一个名为`get_person_info`的自定义函数,该函数返回`person_type`表类型。
Oracle 自定义函数Sql代码1. --没有参数的函数2. create or replace function get_user return varchar2 is3. v_user varchar2(50);4. begin5. select username into v_user from user_users;6. return v_user;7. end get_user;8.9. --测试10. 方法一11. select get_user from dual;12.13. 方法二14. SQL> var v_name varchar2(50)15. SQL> exec :v_name:=get_user;16.17. PL/SQL 过程已成功完成。
18.19. SQL> print v_name20.21. V_NAME22. ------------------------------23. TEST24.25. 方法三26. SQL> exec dbms_output.put_line('当前数据库用户是:'||get_user);27. 当前数据库用户是:TEST28.29. PL/SQL 过程已成功完成。
--没有参数的函数create or replace function get_user return varchar2 is v_user varchar2(50);begin select username into v_user from user_users; return v_user;end get_user;--测试方法一select get_user from dual;方法二SQL> var v_name varchar2(50)SQL> exec :v_name:=get_user;PL/SQL 过程已成功完成。
存储过程、存储函数概述存储过程和存储函数指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。
存储过程和存储函数的相同点:完成特定功能的程序。
存储过程和存储函数的不同点:存储函数可以用return语句返回,存储过程不能用return 语句返回。
存储过程的创建和调用创建和使用存储过程语法:create [or replace] procedure 过程名(参数列表) --or replace替换一个存储过程as --声明部分,同declare同一个意思plsql子程序体;注意:当程序体执行完之后在plsql当中会有一个存储数据库对象。
例子:使用存储过程打印hellowordcreate or replace procedure sayhellowordas 说明部分begindbms_output.put_line('helloword');end;/调用存储过程:方法1、exec syhellloword();方法2、beginsayhelloworld();sayhelloworld();end;/通过sqlplus调用存储过程打印出结果带参数的存储过程创建带参数的存储过程给指定员工涨100工资,并且打印涨前涨后的薪水实例:create or replace procedure raisesala(eno in number) --in为输入参数as --声明部分psal emp.sal%type; --声明变量begin--查询员工涨前薪水select psal into sal from emp where empno = eno;--修改员工薪水加100update emp set sal = sal +100 where empno = eno;--打印涨前和涨后的薪水dbms_output.put_line('涨前'||psal||'涨后'psal+100)end;/--结果输出,打开sqlplus通过如下语法执行进行修改薪水beginraisesala(7839); --括号内的值为打印输入的人员编号raisesala(7566);commit; --因为提交过事务,所以需要使用commit进行结束end;/执行后结果:。
--存储过程的定义默认inCreate or Replace Procedure 过程名(变量名[in,out,inout] 数据类型)[is,as]--自定义变量BeginEnd [过程名];--自定义函数的定义默认inCreate or Replace Function 函数名(变量名[in,out,inout] 数据类型)Return 数据类型[is,as]自定义变量BeginReturn 值;End [函数名];Create function XXX(saljia number) return numberAsBegin…………………Sal+20endselect XXX(sal) from emp;函数调用限制1、SQL语句中只能调用函数2、SQL只能调用带有输入参数,不能带有输出,输入输出函数3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句异常错误处理一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。
ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理。
1.1 异常处理概念异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行.有三种类型的异常错误:1.预定义( Predefined )错误ORACLE预定义的异常情况大约有24个。
对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。
2.非预定义( Predefined )错误即其他标准的ORACLE错误。
对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
3.用户定义(User_define) 错误程序执行过程中,出现编程人员认为的非正常情况。
oracle中create or replace function摘要:1.Oracle 数据库中的CREATE OR REPLACE FUNCTION 语句介绍2.使用CREATE OR REPLACE FUNCTION 创建自定义函数的语法及示例3.CREATE OR REPLACE FUNCTION 与CREATE FUNCTION、ALTER FUNCTION 的对比4.总结CREATE OR REPLACE FUNCTION 的作用和应用场景正文:在Oracle 数据库中,CREATE OR REPLACE FUNCTION 语句用于创建或替换自定义函数。
自定义函数可以简化SQL 查询,提高代码复用性和增强SQL 功能。
CREATE OR REPLACE FUNCTION 语句的使用,可以帮助我们更加灵活地操作Oracle 数据库。
使用CREATE OR REPLACE FUNCTION 创建自定义函数的语法如下:```CREATE OR REPLACE FUNCTION function_name ( parameter_list ) RETURN typeIS-- 函数体function_body;END;```其中,`function_name`为自定义函数的名称,`parameter_list`为传入函数的参数列表,`type`为函数的返回类型,`function_body`为自定义函数的具体实现。
以下是一个使用CREATE OR REPLACE FUNCTION 创建自定义函数的示例:```CREATE OR REPLACE FUNCTION get_employee_salary ( emp_id IN employees.id%TYPE )RETURN employees.salary%TYPEISsalary employees.salary%TYPE;BEGINSELECT salaryINTO salaryFROM employeesWHERE id = emp_id;RETURN salary;END;```上述示例中,我们创建了一个名为`get_employee_salary`的自定义函数,该函数接收一个参数`emp_id`,并返回与该参数对应的员工工资。
oracle除法运算(实用版)目录1.Oracle 简介2.Oracle 除法运算的实现方法3.Oracle 除法运算的优点和局限性4.结论正文1.Oracle 简介Oracle 是一种广泛使用的关系型数据库管理系统,它以其高效、稳定和安全著称。
Oracle 数据库可以存储和管理大量数据,并提供丰富的数据处理功能,如查询、插入、更新和删除等。
在 Oracle 数据库中,除法运算是一个常见的操作,但它并不是直接通过 SQL 语句实现的。
2.Oracle 除法运算的实现方法在 Oracle 数据库中,除法运算通常通过自定义函数或存储过程实现。
自定义函数是一种可重用的代码块,用于执行特定任务。
在 Oracle 数据库中,可以使用 PL/SQL 语言编写自定义函数来实现除法运算。
以下是一个使用PL/SQL编写的简单除法运算函数示例:```CREATE OR REPLACE FUNCTION divide(p IN NUMBER, d IN NUMBER) RETURN NUMBER ISBEGINIF d = 0 THENRAISE NO_DATA_FOUND;END IF;RETURN p / d;END;```在使用自定义函数进行除法运算时,需要将其名称和参数传递给函数,如下所示:```SELECT divide(10, 2) FROM DUAL;```3.Oracle 除法运算的优点和局限性Oracle 除法运算的优点包括:- 高效:Oracle 数据库可以利用底层硬件资源,实现高效的除法运算。
- 安全:通过使用自定义函数或存储过程,可以确保除法运算的安全性,避免 SQL 注入等安全风险。
- 可定制:可以根据具体需求编写自定义函数,实现更复杂的除法运算。
然而,Oracle 除法运算也存在局限性:- 不易维护:与直接使用 SQL 语句相比,自定义函数或存储过程的维护成本较高。
- 可读性较差:使用 PL/SQL 编写的自定义函数或存储过程的可读性较差,可能导致代码难以理解和维护。
oracle秒数转为天时分秒的函数1.引言在1.1 概述部分,可以写下以下内容:本文主要介绍了一个在Oracle数据库中将秒数转换为天时分秒格式的函数。
在实际应用中,我们经常需要将一个给定的秒数转化为更容易理解的天时分秒形式,以便更直观地了解时间的长度。
为了解决这个需求,开发了一个自定义的函数,能够将给定的秒数转换成天、小时、分钟和秒的形式。
这个函数可以很方便地应用在各种需要时间格式转换的场景,比如统计时间长度、计算时间差等等。
本文将会详细介绍该函数的实现原理和具体代码,详细解释每一步骤的逻辑和代码实现。
读者将能够清楚地了解该函数的使用方法和效果,同时也能够针对具体需求进行适当的修改和调整。
通过阅读本文,读者将会了解到如何通过这个函数,快速准确地将秒数转换为天时分秒的格式,将原本复杂的时间信息转化为更加直观和易读的形式。
本文还将对该函数的应用前景进行探讨,并总结其在实际项目中的使用价值。
接下来,我们将进入正文部分,详细介绍Oracle秒数转换为天时分秒的需求和函数的实现过程。
1.2 文章结构本文主要介绍了如何使用Oracle编写一个函数,将给定的秒数转换为天、时、分、秒的格式。
文章分为以下几个部分:1. 引言:介绍本文的概述、文章结构和目的。
2. 正文:- 2.1 Oracle秒数转为天时分秒的需求:说明为什么需要将秒数转换为天、时、分、秒的格式,以及应用场景。
- 2.2 实现Oracle秒数转为天时分秒的函数:详细介绍了如何编写一个函数来实现秒数转换的逻辑,包括使用Oracle的内置函数和自定义函数来处理时间转换。
3. 结论:- 3.1 总结:对本文的内容进行总结,强调实现秒数转换的重要性和优势。
- 3.2 应用前景:展望将来秒数转换函数的应用前景,以及可能的扩展和改进方向。
通过本文的阅读,读者将对如何在Oracle中实现秒数转换为天、时、分、秒的格式有一个全面的了解,并能够应用于具体的业务场景中。
Oracle⾃定义脱敏函数对于信息安全有要求的,在数据下发和同步过程中需要对含有⽤户⾝份信息的敏感字段脱敏,包括⽤户姓名、证件号、地址等等,下⾯是⾃定义函数的代码CREATE OR REPLACE FUNCTION F_GET_SENSITIVE(IN_STR VARCHAR, IN_TYPE NUMBER)RETURN VARCHAR2 ISV_STR_LENGTH NUMBER;V_NAME VARCHAR2(1000);V_N NUMBER;V_HID VARCHAR2(200);V_SQL VARCHAR2(200);V_NUM_FLAG NUMBER;/****N_TYPE 脱敏字段类型1 :名称11:地址2 :证件3 :银⾏账号4 :联系电话5 :接⼊号码***/BEGINV_STR_LENGTH := LENGTH(IN_STR);V_N := 0;IF V_STR_LENGTH=0 THENRETURN(NULL);END IF;/**********名称和地址脱敏规则**********/IF IN_TYPE = 1 OR IN_TYPE=11 THENIF V_STR_LENGTH = 2 OR V_STR_LENGTH = 3 THENV_NAME := REGEXP_REPLACE(IN_STR, '(.)', '*', 2, 1);ELSIF V_STR_LENGTH < 2 THENV_NAME :=IN_STR;ELSEWHILE V_N < V_STR_LENGTH / 2 LOOPV_N := V_N + 1;V_HID := V_HID || '*';END LOOP;V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 2) || V_HID;END IF;RETURN(V_NAME);END IF;/**********证件脱敏规则**********/IF IN_TYPE = 2 THENIF V_STR_LENGTH = 15 THENV_NAME := SUBSTR(IN_STR, 0, 6) || '******' || SUBSTR(IN_STR, -3, 3);ELSIF V_STR_LENGTH = 18 THENV_NAME := SUBSTR(IN_STR, 0, 6) || '********' || SUBSTR(IN_STR, -4, 4);ELSEWHILE V_N < V_STR_LENGTH / 3 LOOPV_N := V_N + 1;V_HID := V_HID || '*';END LOOP;V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 3) || V_HID ||SUBSTR(IN_STR, -V_STR_LENGTH / 3, V_STR_LENGTH / 3);END IF;RETURN(V_NAME);END IF;/**********银⾏账号脱敏规则**********/IF IN_TYPE = 3 THENIF V_STR_LENGTH > 15 THENV_NAME := SUBSTR(IN_STR, 0, 4) || '********' || SUBSTR(IN_STR, -4, 4);ELSEV_NAME :=IN_STR;END IF;RETURN(V_NAME);END IF;/**********联系电话脱敏规则**********/IF IN_TYPE = 4 THENV_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH - 4) || '****';RETURN(V_NAME);END IF;/**********接⼊号码脱敏规则**********/IF IN_TYPE = 5 THENV_SQL := 'SELECT COUNT(1) FROM DUAL WHERE LENGTH(''' || IN_STR ||''') = LENGTH(REGEXP_REPLACE(''' || IN_STR || ''', ''[^0-9]''))';EXECUTE IMMEDIATE V_SQLINTO V_NUM_FLAG;IF V_NUM_FLAG = 1 AND (V_STR_LENGTH = 7 OR V_STR_LENGTH = 8) THEN V_NAME := SUBSTR(IN_STR, 0, 2) || '****' || SUBSTR(IN_STR, -2, 2);ELSIF V_NUM_FLAG = 1 AND V_STR_LENGTH = 11 THENV_NAME := SUBSTR(IN_STR, 0, 3) || '*****' || SUBSTR(IN_STR, -3, 3);ELSEV_NAME := IN_STR;END IF;RETURN(V_NAME);END IF;RETURN(IN_STR);EXCEPTIONWHEN OTHERS THEN-- DBMS_OUTPUT.PUT_LINE('1'||V_SQL);V_NAME := '-1';RETURN V_NAME;END F_GET_SENSITIVE;。
oracle 自定义函数
oracle自定义函数是最重要的函数之一,下面就为您介绍oracle自定义函数的使用,实现返回表类型,希望对您能够有所帮助。
oracle中的函数可以返回表类型。
但是,这个表类型实际上是集合类型(与数组类似)这个类型不能直接作为 from 的宾语。
从oracle 9i 开始,提供了一个叫做“管道化表函数”的概念,来解决这个问题。
这种类型的函数,必须返回一个集合类型,且标明 pipelined。
这个函数不能返回具体变量,必须以一个空 return 返回。
这个函数中,通过 pipe row () 语句来送出要返回的表中的每一行。
调用这个函数的时候,通过 table() 关键字把管道流仿真为一个数据集
以下是一个十分简单的实例:
create table tb1(k number, v varchar2(10));
insert into tb1(k, v) values(100,'aaa');
insert into tb1(k, v) values(200,'bbb');
insert into tb1(k, v) values(200,'ccc');
select * from tb1;
create type row_type1 as object(k number, v varchar2(10));
create type table_type1 as table of row_type1;
create or replace function fun1 return table_type1 pipelined as
v row_type1;
begin
formyrow in (select k, v from tb1) loop
v := row_type1(myrow.k, myrow.v);
pipe row (v);
end loop;
return;
end;
select * from table(fun1);。