2014-11-03 38 views
0

我有某些数学公式从数据库中获取记录。这些公式是在Function/SP中硬编码的。我需要将我所有的公式移动到一个单独的表格中,我将从函数/ SP中调用公式ID,以便公式在运行时需要用值替换。在Oracle中解析动态公式11g

在此先感谢。

+0

你的问题在哪里?任何有问题的代码分享? – 2014-11-03 10:35:10

+0

我该怎么做?这个问题! – Vasanthan 2014-11-03 11:02:53

+0

我需要将此公式移至表格中。 @运行时我将获取该公式并运行。问题是我如何将列名称作为此公式的一部分,我如何将这些公式替换为列名称? – Vasanthan 2014-11-03 11:08:52

回答

1

这个怎么样:

DECLARE 
    formula VARCHAR2(100) := '3 * 4 + 1'; 
    r NUMBER; 
BEGIN 
    EXECUTE IMMEDIATE 'BEGIN :res := '||formula||'; END;' USING OUT r; 
    DBMS_OUTPUT.PUT_LINE ('r = ' || r); 
END; 

r = 13 
1

尝试Tom Kyte's answers on the evaluating the expressions。你的情况,你可以有一些表的公式,例如

create table FORMULA 
(
    ID   INTEGER not null, 
    EXPRESSION VARCHAR2(4000) 
); 
alter table FORMULA 
    add constraint PK_FORMULA_ID primary key (ID); 

这里填充一些数据。

insert into formula (ID, EXPRESSION) 
values (1, '1 * (12.1 * POWER(in_variable,2.06))'); 
commit; 

从上面的链接创建包。

create or replace package eval is 

    function do_it(p_function in varchar2, p_var in number) return number; 

end eval; 
/
create or replace package body eval is 

    g_theCursor integer default dbms_sql.open_cursor; 

    function do_it(p_function in varchar2, p_var in number) return number is 
     l_rowsprocessed number default 0; 
     l_retval number; 
    begin 
     dbms_sql.parse(g_theCursor, 
        'begin :ret_val := ' || 
         replace(p_function, 'in_variable', ':in_variable') || 
         '; end;', dbms_sql.native); 

     dbms_sql.bind_variable(g_theCursor, ':ret_val', l_retval); 
     begin 
     dbms_sql.bind_variable(g_theCursor, ':in_variable', p_var); 
     exception 
     when others then 
      if (sqlcode = -1006) then 
       null; 
      else 
       raise; 
      end if; 
     end; 
     l_rowsprocessed := dbms_sql.execute(g_theCursor); 
     dbms_sql.variable_value(g_theCursor, ':ret_val', l_retval); 

     return l_retval; 
    end do_it; 

end eval; 
/

瞧!

declare 
    in_variable int := 5; 
begin 
    for F in (select * from formula) loop 
     dbms_output.put_line(eval.do_it('1 * (12.1 * POWER(in_variable,2.06))', in_variable)); 
    end loop; 
end; 

我们将得到的结果。

333.168228204034354868248961030690574583 

我不知道您确切的要求,所以我没有以下问题的答案您需要表达式的属性吗?或者你需要动态替换?等等,但我希望这会帮助你,有一些出发点。