我有某些数学公式从数据库中获取记录。这些公式是在Function/SP中硬编码的。我需要将我所有的公式移动到一个单独的表格中,我将从函数/ SP中调用公式ID,以便公式在运行时需要用值替换。在Oracle中解析动态公式11g
在此先感谢。
我有某些数学公式从数据库中获取记录。这些公式是在Function/SP中硬编码的。我需要将我所有的公式移动到一个单独的表格中,我将从函数/ SP中调用公式ID,以便公式在运行时需要用值替换。在Oracle中解析动态公式11g
在此先感谢。
这个怎么样:
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
尝试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
我不知道您确切的要求,所以我没有以下问题的答案您需要表达式的属性吗?或者你需要动态替换?等等,但我希望这会帮助你,有一些出发点。
你的问题在哪里?任何有问题的代码分享? – 2014-11-03 10:35:10
我该怎么做?这个问题! – Vasanthan 2014-11-03 11:02:53
我需要将此公式移至表格中。 @运行时我将获取该公式并运行。问题是我如何将列名称作为此公式的一部分,我如何将这些公式替换为列名称? – Vasanthan 2014-11-03 11:08:52