我有这样大的代码,我想在我的搜索3件事情内侧箱或解码:
1 - 寻找所有的订单(交付,而不是)搜索匹配的:
2-寻找与搜索相匹配的所有吊坠订单;
3-查找与搜索匹配的所有交付订单;的if-else,一个裁判光标
create or replace
function search_order(search IN VARCHAR2, a_option NUMBER) RETURN types.ref_cursor
AS
orders_cursor types.ref_cursor;
BEGIN
if search is not null then
if a_option = 0 then /*case 1*/
OPEN orders_cursor FOR
select value(f), value(p),i.qtd_if, i.prec_total_if , forn.nome_fornecedor
from item_fornecimento i, produto p ,fornecimento f, fornecedor forn
where f.id_fornecimento in (select f.id_fornecimento from fornecimento f where f.id_fornecedor in
(select f1.id_fornecedor from fornecedor f1 where f1.nome_fornecedor LIKE '%'||search||'%'))
and f.id_fornecimento= i.id_fornecimento and i.id_prod= p.id_prod and
f.id_fornecedor = forn.id_fornecedor
order by forn.nome_fornecedor,f.data_encomenda desc,p.nome_prod asc;
RETURN orders_cursor;
ELSIF a_option = 1 then /*case 2*/
OPEN orders_cursor FOR
(...)
where f.id_fornecimento in (select f.id_fornecimento from fornecimento f where f.id_fornecedor in
(select f1.id_fornecedor from fornecedor f1 where f1.nome_fornecedor LIKE '%'||search||'%')and f.data_entrega is null)
(...)
RETURN orders_cursor;
ELSE /* case 3*/
OPEN orders_cursor FOR
(...)
where f.id_fornecimento in (select f.id_fornecimento from fornecimento f where f.id_fornecedor in
(select f1.id_fornecedor from fornecedor f1 where f1.nome_fornecedor LIKE '%'||search||'%')and f.data_entrega is not null)
(...)
RETURN orders_cursor;
end if;
end if;
END;
这工作,如果我的搜索不为空,但如果是我想只是修改一点点内部的选择,并把它变成是这样的: (select f1.id_fornecedor from fornecedor f1 where f1.nome_fornecedor LIKE '%'||search||'%')and f.data_entrega is not null)
到 - >(select f1.id_fornecedor from fornecedor f1)and f.data_entrega is not null)
所以我有3个搜索条件,我想知道是否有可能使用大小写,解码或其他光标与参数,做这个内部选择:
- LIKE如果搜索字符串不是空值;
- 没有LIKE,如果字符串为空;
但我还没有看到任何这样的例子,事情可以真的很乱。 有人可以用相同的代码来帮助新手吗?
你的代码 - 如你所说 - 太大了,因为有很多重复的。避免重复的方法是将查询分解为组件,并使用动态SQL来组装引用游标语句。明确的重复性方法的优点是您可以获得关于依赖性的反馈。但它带来了维护费用。所以这归结于味道的问题。 – APC 2010-01-24 21:57:51