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等均可 ,请高手帮忙 ,谢谢!
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等均可 ,请高手帮忙 ,谢谢!
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';