如何在Firebird执行块中交互式设置declare变量值?
Firebird伪全文搜索的交互式参数配置问题
我可以运行以下SQL实现Firebird数据库的伪全文搜索:
--伪全文搜索实现 --参考全表查找逻辑实现 --TODO: 搜索字符串(及匹配条件)应在执行时交互式设置,而非硬编码 execute block returns ( table_name varchar(40), table_desc varchar(63), column_name varchar(40), column_desc varchar(63), drilldown_SQL varchar(255) ) as declare search_value varchar(30) = 'search_string'; --declare search_condition varchar(30) = '='; --declare search_condition varchar(30) ='like'; declare search_condition varchar(30) ='containing'; declare has_result boolean; begin for select trim(r.rdb$relation_name) , substring(r.rdb$description from 1 for 63) , trim(f.rdb$field_name) , substring(f.rdb$description from 1 for 63) , 'select '||trim(f.rdb$field_name)|| ', '||trim(r.rdb$relation_name)|| '.* from ' || trim(r.rdb$relation_name) || ' where ' || trim(f.rdb$field_name) || ' ' || :search_condition || ' ''' || :search_value || '''' from rdb$relation_fields f join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name and r.rdb$view_blr is null and (r.rdb$system_flag is null or r.rdb$system_flag = 0) order by r.rdb$relation_name, f.rdb$field_position into :table_name, :table_desc, :column_name, :column_desc, :drilldown_SQL do begin execute statement ('select exists(select * from "' || table_name || '" where "' || column_name || '" ' || search_condition || ' ?) from rdb$database') (search_value) into has_result; if (has_result) then suspend; when any do begin /* 值无法与varchar比较,跳过 */ end end end
遇到的问题
- 单独执行带参数的查询语句(如
select 'abc' as row1 from RDB$DATABASE where 1 like :string)时,会正常弹出参数输入提示并执行成功 - 但在上述伪全文搜索的
execute block中,尝试将硬编码的搜索值改为交互式参数(即把declare search_value varchar(30) = 'search_string';改为declare search_value varchar(30) = :searchstring;)时,会触发错误**-104(未知Token :)**
运行环境限制
该SQL运行在ERP软件的SQL执行对话框中,仅拥有只读权限:
- 支持执行
select语句和execute block - 无法连续执行多条SQL语句(例如
select * from table1;select * from table2;会报错)
内容的提问来源于stack exchange,提问作者sirtet
相关产品推荐
相关产品推荐

