drop table t23
ORA-00942: table or view does not existMore Details: https://docs.oracle.com/error-help/db/ora-00942
create table t23 (ID number, Calculation varchar2(128), value number)
Table created.
insert into t23 values (1, null,10)
1 row(s) inserted.
insert into t23 values (2, null,10)
1 row(s) inserted.
insert into t23 values (3,'1+2',null)
1 row(s) inserted.
insert into t23 values (4, null,5)
1 row(s) inserted.
insert into t23 values (5,'3-2',null)
1 row(s) inserted.
insert into t23 values (6,'5+1',null)
1 row(s) inserted.
alter table t23 add constraint t23_pk primary key (id)
Table altered.
select regexp_substr(calculation, '[0-9]+', 1, 1) as n1
, regexp_substr(calculation, '[\-\+\*\%]', 1, 1) as oprtr
, regexp_substr(calculation, '[0-9]+', 1, 2) as n2
from t23
where calculation is not null
N1 | OPRTR | N2 |
---|---|---|
1 | + | 2 |
3 | - | 2 |
5 | + | 1 |
create or replace function dyn_calc
(p_id in number)
return number
is
result number;
n1 number;
n2 number;
l_rec t23%rowtype;
l_val number;
type split_calc_r is record (
val1 number
, operator varchar2(1)
, val2 number
);
l_calc_rec split_calc_r;
function get_rec
(p_id in number)
return t23%rowtype
is
rv t23%rowtype;
begin
select *
into rv
from t23
where id = p_id;
return rv;
end get_rec;
procedure split_calc
(p_calc in varchar2
, p_n1 out number
, p_n2 out number
, p_operator out varchar2)
is
begin
p_n1 := regexp_substr(p_calc, '[0-9]+', 1, 1);
p_n2 := regexp_substr(p_calc, '[0-9]+', 1, 2);
p_operator := translate(p_calc, '-+*%01923456789','-+*%'); --regexp_substr(p_calc, '[\-\+\*\%]', 1, 1);
end split_calc;
function exec_calc
(p_n1 in number
, p_n2 in number
, p_operator in varchar2)
return number
is
rv number;
begin
execute immediate
'select :n1 ' || p_operator || ' :n2 from dual'
into rv
using p_n1, p_n2;
return rv;
end exec_calc;
begin
l_rec := get_rec(p_id);
if l_rec.value is not null then
result := l_rec.value;
else
split_calc(l_rec.calculation
, l_calc_rec.val1
, l_calc_rec.val2
, l_calc_rec.operator);
n1 := dyn_calc (l_calc_rec.val1);
n2 := dyn_calc (l_calc_rec.val2);
result := exec_calc(n1, n2, l_calc_rec.operator);
end if;
return result;
end;
Function created.
select id, calculation, dyn_calc(id) as value
from t23
where calculation is not null
ID | CALCULATION | VALUE |
---|---|---|
3 | 1+2 | 20 |
5 | 3-2 | 10 |
6 | 5+1 | 20 |