Все решения, построенные вокруг условий в «где» части запроса, работают, но не оптимально с точки зрения производительности. Поэтому, если tableName
действительно большой, то лучшим вариантом будет построение динамического SQL или реализация этого случая как двух отдельных запросов.
Е.Г.
create or replace procedure GetSomething(
inputParameter in varchar2,
someValue in varchar2
)
return sys_refcursor
as
cRet sys_refcursor;
begin
if(inputParam = 'X') then
open cRet for
select * from tableName where col1 = someValue
;
elsif(inputParam = 'Y') then
open cRet for
select * from tableName where col2 = someValue
;
else
raise_application_error(-20001,'Invalid value of inputParameter.');
end if;
end;
Конечно, для хорошей производительности оба столбца должны быть проиндексированы.