의 Ref 커서의 내부 케이스 또는 디코딩 : 검색과 일치
1 모든 주문에 대한보기 (전달되지 않음) :
2 - 검색과 일치하는 모든 펜던트 주문을 찾습니다.
3 검색과 일치하는 모든 배달 된 주문을 찾습니다.-경우 다른 내가 내 검색 3 가지 원하는이 큰 코드가
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;
내 검색 null가 아닌 경우,이 작동하지만,이 경우 나는 조금에게 내부 선택을 수정하고이 같은으로 바꿀 싶습니다 : (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 없는;
- LIKE이 없으면 문자열이 null 인 경우;
그러나 이것에 대한 예는 보지 못했지만 실제로는 상당히 엉망이 될 수 있습니다. 누군가가 동일한 코드로 초보자를 도울 수 있습니까?
귀하의 코드는 - 당신이 말하는대로 - 많은 반복이 있기 때문에 너무 큰. 반복을 피하는 방법은 쿼리를 구성 요소로 분해하고 동적 SQL을 사용하여 참조 커서 문을 조합하는 것입니다. 명시적이고 반복적 인 접근 방법의 장점은 종속성에 대한 피드백을 얻는 것입니다. 그러나 유지 관리 오버 헤드가 발생합니다. 그래서 그것은 맛의 문제로 귀결됩니다. – APC