是否可以评估存储过程中的表达式?

时间:2013-01-14 12:38:52

标签: oracle stored-procedures plsql expression

我有两张表

 
tbl1
+-------+---------+ 
| id    | number  | 
+-------+---------+ 
| a001  |  001    | 
| a002  |  002    |
| a003  |  003    |
| a004  |  004    |
| a005  |  002    |
+-------+---------+

tbl2
+----+-----------------------------------+------------+ 
| id | Extression                        | True/False | 
+----+-----------------------------------+------------+
| 01 | `a003=a001+ a002`                 |            |
| 02 | `a004=a001+ a002`                 |            |
| 03 | `a004 + a005 =a001 + a002 + a003` |            |
+----+-----------------------------------+------------+

我想根据表达式的结果更新True / False列。在这种情况下,01为true,02为false,03为true。 我在c#代码中完成了这个。但由于runnig exe通过作业的限制,我想通过oracle中的程序来做到这一点。 这可能吗?

2 个答案:

答案 0 :(得分:1)

是的,你可以这样做。看起来你需要编写一个程序来解析和评估你的表达式,但假设你已经这样做并调用了程序EVALUATOR_PROC,你的插入看起来就像

INSERT INTO TBL2 (ID,   EXTRESSION,        TRUE_FALSE)
           VALUES('01', 'a003=a001+ a002', EVALUATOR_PROC('a003=a001+ a002'))

分享并享受。

答案 1 :(得分:1)

您可以将所有查找放入一个数组中,然后对其运行一个pl / sql块。

SQL> create package pkg_eval
  2  as
  3    function eval_expr(p_str in tbl2.expression%type)
  4      return varchar2;
  5  end pkg_eval;
  6  /

Package created.

SQL> create package body pkg_eval
  2  as
  3    --  Type to hold lookup values
  4    type lookup_tab is table of number index  by varchar2(4000);
  5    t_lookup lookup_tab;
  6
  7    function eval_expr(p_str in tbl2.expression%type)
  8      return varchar2
  9    is
 10      v_str varchar2(32767) := p_str;
 11      v_idx tbl1.id%type;
 12      v_res varchar2(5);
 13    begin
 14
 15      -- iterate through each lookup and replace it in the input expression
 16      v_idx := t_lookup.FIRST;
 17      while v_idx is not null
 18      loop
 19        v_str := replace(v_str, v_idx, t_lookup(v_idx));
 20        v_idx := t_lookup.NEXT(v_idx);
 21      end loop;
 22      -- Run the expression.
 23      execute immediate '
 24      declare
 25        v_res varchar2(5);
 26      begin
 27        if ((' || v_str || '))
 28        then
 29          v_res := ''true'';
 30        else
 31          v_res := ''false'';
 32      end if;
 33        :a := v_res;
 34      end;' using out v_res;
 35
 36      return v_res;
 37    end eval_expr;
 38
 39  -- Populate lookup values, once per session.
 40  begin
 41    for r_row in (select id, val
 42                     from tbl1)
 43    loop
 44      t_lookup(r_row.id) := r_row.val;
 45    end loop;
 46  end pkg_eval;
 47  /

Package body created.

SQL> col result  format a10
SQL> select t.*, pkg_eval.eval_expr(t.expression) result from tbl2 t;

        ID EXPRESSION                      RESULT
---------- ------------------------------- ----------
         1 a003=a001+ a002                 true
         2 a004=a001+ a002                 false
         3 a004 + a005 =a001 + a002 + a003 true

P.S。对于错误处理,您可能希望处理像

这样的损坏表达式
    return v_res;
  exception
    when others
    then
      return 'unknown';
  end eval_expr;