关于Oracle中split函数的实现以及函数递归的举例。
今天看到网友提出了这么一个问题。
看下面这张表:
指标编号 计算公式 指标值 可分解标志
A (B+C)+E ? 1
B 10 0
C D+E ? 1
D 30 0
E 5 0
标志为0的指标值是固定的,标志为1的指标值根据公式去计算。
我觉得这个问题很有意思
,利用函数递归即可实现,当然需要对公式进行解析,这里我使用了类似于split的自建函数来实现。下面是方法——
创建类型tbl_str,
创建函数to_table,
创建测试表Test,
创建公式符号表expression,
创建函数f_test_get_value,
目前仅支持+ - * / ( ),如果需要别的符号自己加在表expression中.
Test表中的Formula字段每个字符都要用空格分开,例如 ( B + C ) + E
代码如下:
/*************************************************************************************/
create or replace type tbl_str as table of varchar2(4000);
/*********************************************************
/* Description:字定义类型,用于to_table函数
/* Author:He Yixiang
*********************************************************/
/
create or replace function to_table(pv_str varchar2,pv_split varchar2) return tbl_str
as
ltab tbl_str := tbl_str();
pos integer := 0;
ls varchar2(4000) := pv_str;
/*********************************************************
/* Description:同Split函数
/* Author:He Yixiang
*********************************************************/
begin
pos := instr(ls,pv_split);
while pos > 0 loop
ltab.extend;
ltab(ltab.count) := substr(ls,1,pos - 1);
ls := substr(ls,pos + length(pv_split));
pos := instr(ls,pv_split);
end loop;
ltab.extend;
ltab(ltab.count) := ls;
return ltab;
end;
/
create table test (id char(1),formula varchar2(100),value number,flag char(1));
insert into test select 'A','( B + C ) + E',null,1 from dual;
insert into test select 'B',null,10,0 from dual;
insert into test select 'C','D + E',null,1 from dual;
insert into test select 'D',null,30,0 from dual;
insert into test select 'E',null,5,0 from dual;
commit;
create table expression (exp_value char(1));
insert into expression (exp_value) values ('+');
insert into expression (exp_value) values ('-');
insert into expression (exp_value) values ('*');
insert into expression (exp_value) values ('/');
insert into expression (exp_value) values ('(');
insert into expression (exp_value) values (')');
commit;
create or replace function f_test_get_value(pc_id in char) return number is
Result number;
c_flag char(1);
type curtype is ref cursor;
cur curtype;
c_para char(1);
v_sqlstr varchar2(4000);
n_count number;
/*********************************************************
/* Description:根据表test中的公式Formula计算返回Value值
/* Author:He Yixiang
*********************************************************/
begin
select flag into c_flag from test where id=pc_id;
if c_flag='0' then
select value into Result from test where id=pc_id;
else
open cur for
select column_value from table(cast(to_table((select formula from test where id=pc_id),' ') as tbl_str));
v_sqlstr:='select ';
loop
fetch cur into c_para;
exit when cur%notfound;
select count(*) into n_count from expression where exp_value=c_para;
if n_count>0 then
v_sqlstr:=v_sqlstr||c_para;
else
v_sqlstr:=v_sqlstr||f_get_value(c_para);
end if;
end loop;
v_sqlstr:=v_sqlstr||' from dual';
execute immediate v_sqlstr into Result;
close cur;
end if;
return(Result);
end f_test_get_value;
/
分享到:
相关推荐
### Oracle Split 函数详解 #### 一、Oracle Split 函数简介 在Oracle数据库中,并没有内置的split函数来处理字符串的分割操作。然而,在实际应用中,经常需要将一个包含多个值的字符串按照指定的分隔符进行拆分,...
Oracle 中实现 Split 函数功能 Oracle 中实现 Split 函数功能是指在 Oracle 数据库中实现类似于 C# 等编程语言中的 Split 函数,用于拆分字符的功能。下面是实现 Oracle 中 Split 函数功能的详细介绍。 首先,...
### Oracle Split函数实现与应用 #### 一、Oracle Split函数简介 在Oracle数据库中,处理字符串是一项常见的需求,尤其是在需要将包含特定分隔符的字符串分割成多个独立的部分时。Oracle标准SQL并没有提供直接用于...
在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...
### Oracle Split功能详解 在Oracle数据库管理中,有时我们需要对字符串进行分割处理,这与.NET框架中的`Split`函数有着相似的功能。本文将详细介绍如何在Oracle中实现类似于.NET中的`Split`函数,并通过一个具体的...
4、易于集成:函数设计简洁,易于集成到现有的Oracle数据库系统中,无需复杂的配置和改造。 5、优化查询性能:通过避免复杂的子查询和嵌套循环,我们的函数显著提升了数据处理的速度,减少了数据库资源的消耗,让您...
Oracle 分割字符串 返回多行数据
Erp/Ehr/Crm/Clm系统的开发者很多时候会用到姓名拆分为汉语拼音的代码。 这个函数可以帮你实现以下内容。...select fn_getpy( F_namesplit('张三',1),2) as 姓,fn_getpy( F_namesplit('张三',2),2) as 名 from dual
Oracle 自定义split 函数 Oracle没有提供split函数,但可以自己建立一个函数实现此功能。比如“abc defg hijkl nmopqr stuvw xyz”,分隔符是空格,但空格个数不定。 源代码: CREATE OR REPLACE TYPE ty_str_...
在Oracle E-Business Suite(EBS)中,订单管理模块的订单行分割是一个常见需求,尤其是当一个订单行需要被分解成多个部分来处理时。文档中描述的脚本基于OE_ORDER_PUB包,该包是Oracle Order Management的一部分。...
在Oracle数据库中,由于默认的SQL语法并不支持像JavaScript或.NET框架中那样直接对字符串进行`split`操作,所以在处理批量操作时,需要通过自定义函数来实现类似的功能。这里介绍的方法是创建两个用户自定义函数,即...
通过本示例,我们了解了如何使用Oracle中的Pipelined Table Function来实现一个高效的split函数。这种方法不仅可以简化字符串处理的任务,还可以显著提高处理大量数据时的性能。在实际应用中,根据不同的需求,我们...
在Oracle数据库中,有时我们需要对字符串进行拆分处理,以便于处理包含多个元素的数据。例如,在给定的场景中,有一个名为`JOB_NUMBER`的字段,它存储的是多个工号,以特定的分隔符(如斜杠"/")分隔。需求是创建一...
在本文中,我们将探讨如何在Oracle中添加`split`和`splitstr`这两个自定义函数,以优化批量操作的性能。 首先,我们需要创建一个名为`tabletype`的表类型,用于存储分割后的字符串元素: ```sql create or replace...
split -b 100m exp_jtkg20210103.dmp.gz exp_jtkg20210103.dmp.gz.split 4. 使用外部存储设备 使用外部存储设备来存储备份文件。例如,可以使用 USB 硬盘或 NAS 设备来存储备份文件。 5. 优化数据库结构 优化...
总的来说,`split`和`splitstr`函数是Oracle数据库中处理字符串的强大工具,它们提供了灵活且高效的字符串处理能力,尤其适用于需要批量处理字符串数据的场景。在实际工作中,根据具体需求定制类似的函数可以显著...
oracle自定义函数,字符串分解,可按分隔符分解字符串,分隔符可自己随便定义,非常灵活。欢迎下载。
在Oracle数据库中,处理字符串是常见的操作之一,尤其是在数据分析或数据清洗的过程中。有时我们需要将一个长字符串分割成多个部分,以便进行进一步的操作。Oracle提供了一些内置的函数来帮助我们完成这个任务。本篇...
例如,LMSn和LMDn进程协作处理节点故障检测和资源迁移,而CSSn进程则确保所有节点之间的同步,防止“分割脑”(Split Brain)现象的发生,即集群的一部分认为另一部分已脱离,而实际上网络只是暂时中断。 ### 总结 ...