我有某些數學公式從數據庫中獲取記錄。這些公式是在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