我有两张表
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中的程序来做到这一点。 这可能吗?
答案 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;