Как сгенерировать динамическое условие where в курсоре pl / sql - PullRequest
0 голосов
/ 26 сентября 2019

Создание динамического условия where в курсоре pl / sql на основе входных значений

Например:

Входные значения: значения abc

ЗапросФормат:

CREATE OR REPLACE Procedure abcprocedure
   ( a IN Number,b IN Number, c IN Number )

    cursor abccursor
        IS
           select 1  
             from pqr  p 
            where ( Prepare the where condition based on a,b,c values and null checks also )

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Согласно вашим комментариям, я должен предложить использовать coalesce, где условие:

SELECT *
FROM PQR P
WHERE COALESCE(A, DEPT1) = DEPT1
AND COALESCE(B, DEPT2) = DEPT2
AND COALESCE(C, DEPT3) = DEPT3;

Coalesce примет переданный параметр, если он не равен нулю.Таким образом, вы можете достичь желаемого результата.Если a равно нулю, то dept1 = dept1 будет условием, которое всегда будет истинным (если dept1 в вашей таблице не равно нулю, это вообще другой сценарий)

Cheers !!

2 голосов
/ 26 сентября 2019

Вот как я понял проблему;нет динамический материал необходим.

Для более простого тестирования (со своей стороны, так как у меня нет ваших таблиц), в таблице Скотта DEPT это может помочь (par_x - это имя параметра процедуры).

select *
from dept
where deptno in (par_a, par_b, par_c)
   or (par_a is null and par_b is null and par_c is null);

Если это разные столбцы, проблем также нет:

select * 
from dept
where (deptno = par_a or par_a is null)
  and (dname  = par_b or par_b is null)
  and (loc    = par_c or par_c is null);

Если определенный параметр не передан и вы не хотите видеть значение этого столбца, используйте

select case when par_a is not null then deptno
            else null
       end deptno,
       --
       case when par_b is not null then dname
            else null
       end dname,
       --
       case when par_c is not null then loc
            else null
       end loc
from dept
where (deptno = par_a or par_a is null)
  and (dname  = par_b or par_b is null)
  and (loc    = par_c or par_c is null);

Если вы хотите исключить столбец из набора результатов, ну, это не так просто.Если вы используете (например) Oracle Apex, вы можете не отображать этот столбец.Иначе, в чистом SQL я бы не знал, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...