create table model(
    id  int primary key not null ,
    name  varchar2(10) ,
    systemconstant varchar2(100)
);
create table keyvalues (
    id  int primary key not null ,
    keyname varchar(20) ,
    keyvalue varchar(10)
);
insert into model values(1 , 'ABKVP' ,'(SY_BKVP>1)');
insert into model values(2 , 'BDEHF' ,'(SY_BDE == 0 )||( SY_BDE == 1 )&&(SY_HFM == 0)');
insert into model values(3 , 'BBNWS' ,'(SY_BDE == 0 )||( SY_BDE <= 1 )&&(SY_BDE >= 0&& SY_OPP == 3)');
insert into model values(4 , 'IUOPP' ,'(SY_OPP == 0 )||( SY_YTR == 1 )||(SY_ERR > 2)&&(SY_IUR <=-1)');insert into keyvalues values(1,'SY_BKVP',2);
insert into keyvalues values(2,'SY_BDE' ,1);
insert into keyvalues values(3,'SY_HFM' ,0);
insert into keyvalues values(4,'SY_OPP' ,3);
insert into keyvalues values(5,'SY_ERR','a');表model中的字段systemconstant是一个字符串表达式 ,他所对应的值在第二张keyvalues表中 ,如id=1的model的表达式为“(SY_BKVP>1)” 其中它所对应的键值在第二个表中(id=1)的记录中“SY_BKVP = 2 ”,显然2 > 1 所以条件成立 ,现在需要用一条sql语句把其中满足条件的model给找出来 ,第一个表中systemconstant字符串表达式所对应的key在第二张表中只有唯一的值 ,如果key所对应的值不为数值的话则也不满足条件 ,如SY_ERR在第二表中对应的值为“a”则这个id=4的model也不满足条件 ,同样如果对应的key在第二张表中没有记录则该model也不满足条件,如:“SY_IUR”在第二表中没有记录,则id=4的model也不满足条件 。现在要用一条sql找出满足条件的model ,其中表model中的字段systemconstant字段中表达式是java中的写法 ,他所对应的值在第二张表中 。数据库为oracle 9i 函数,存储过程或者sql等均可 ,请高手帮忙 ,谢谢!

解决方案 »

  1.   


    create or replace function is_expression_right(expression varchar2)
    return varchar2
    is
      const varchar2(20);
      const_value varchar2(10);
      result varchar2(100) := expression; 
      tsql varchar2(200); 
      cursor cur_kv(kn varchar2) is
      select keyvalue from keyvalues where keyname = kn ;
    begin
      while regexp_instr(result, '[A-Z_]+') != 0 
      loop     
         const := regexp_substr(result, '[A-Z_]+');
         
         for tmp in cur_kv(const) loop
             const_value := TMP.keyvalue;
         end loop;
         if regexp_instr(const_value, '[a-zA-Z_]') <> 0 then
            result := '(1 = 2)';
            exit;
         end if;
         
         result := replace(result, const, const_value);
         
      end loop;
      
      while instr(result, '==') <> 0 loop
         result := replace(result, '==', '=');
      end loop;
      while instr(result, '||') <> 0 loop
         result := replace(result, '||', 'or');
      end loop;
      while instr(result, '&&') <> 0 loop
         result := replace(result, '&&', 'and');
      end loop;
      
      tsql := 'select ''YES'' from dual where ' || result;
      execute immediate  tsql into result;
      
      return result;
    end;
    show errors;select * from model where is_expression_right(systemconstant) = 'YES';
      

  2.   

    nGX20080110  果然是高手 ,感谢你给我一个开阔的思维方式 ,问题解决了学到不到以前没用过的东西 ,谢谢