2014-11-03 112 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 

我不知道您確切的要求,所以我沒有以下問題的答案您需要表達式的屬性嗎?或者你需要動態替換?等等,但我希望這會幫助你,有一些出發點。