PLSQL,存储在表中的执行公式

PLSQL,存储在表中的执行公式,plsql,Plsql,我是PLSQL的新手。我只是想知道我是否可以将我的公式作为字符串保存到一个表中,并在函数中使用它来计算一些值 以下是一个例子: ID NAME FORMULA 1 test prm_testval*prm_percent/18 2 test2 (prm_testval +20)*prm_percent 我要做的是从表中选择formula列,并在函数中使用该字符串 select t.* fro

我是PLSQL的新手。我只是想知道我是否可以将我的公式作为字符串保存到一个表中,并在函数中使用它来计算一些值

以下是一个例子:

ID         NAME          FORMULA
1          test          prm_testval*prm_percent/18
2          test2         (prm_testval +20)*prm_percent
我要做的是从表中选择formula列,并在函数中使用该字符串

select t.* from table t where id=1

prm_calculated_value = t.formula 
这里不需要公式的字符串值,只需要公式本身

有什么想法吗,如果我能用的话?

起点是-statement。它是PL/SQL的
eval()

基于此示例,您可以开始构建自己的方法来将符号值(prm_testval和prm_percent)映射到实际值。下一步,你可能想看看

使用客户端提供的数据时要小心另请参见,例如

create table formulas (
  id number,
  name varchar2(20),
  formula varchar2(50)
);

insert into formulas values (1, 'test 1', 'prm_testval*prm_percent/18');
insert into formulas values (2, 'test 2', '(prm_testval +20)*prm_percent');

/* eval from: http://www.adp-gmbh.ch/blog/2005/may/5.html */
create or replace function eval (
 expr in varchar2
) return varchar2 as 
  ret varchar2(32767);
begin
  execute immediate 'begin :result := ' || expr || '; end;' using out ret;
  return ret;
end;
/

create or replace function eval2 (
  vars in varchar2,
  expr in varchar2
) return varchar2 as 
  ret varchar2(32767);
begin
  execute immediate vars || ' begin :result := ' || expr || '; end;' using out ret;
  return ret;
end;
/

create or replace function calc_prm (
  id_ in number,
  prm_testval in varchar2, 
  prm_percent in varchar2
) return number as
  formula_ formulas.formula%type;
  vars constant varchar2(32767) := 
    'declare prm_testval constant number := to_number(' || prm_testval ||
    '); prm_percent constant number := to_number(' || prm_percent || ');';
begin
  select formula into formula_ from formulas where id = id_;
  return eval2(vars, formula_);
end;
/

/* call from SQL */
select eval('3*4') from dual;
select calc_prm(1, 97, 10) from dual;
select calc_prm(2, 97, 10) from dual;

/* call from PL/SQL block */
begin
  dbms_output.put_line(eval('3*4'));
  dbms_output.put_line(calc_prm(1, 97, 10));
  dbms_output.put_line(calc_prm(2, 97, 10));
end;
/