2016-01-14 1 views
0

Существует динамический оператор с несколькими переменными связывания, в которых одна и та же переменная используется во многих местах. Динамический оператор также будет меняться в зависимости от условий. Таким образом, порядок переменных связывания будет варьироваться.Связывание нескольких переменных в динамическом выражении PL/SQL с использованием «USING»

Как я могу привязать все переменные для определенных имен? Например. все :company_id для ссылки на одно значение, все :date_from ссылаются на одно значение и все :date_to для ссылки на одно значение.

SELECT emp_no 
FROM company_tab 
WHERE company_id = :company_id 
AND :template_id IS NOT NULL 
AND :date_from IS NOT NULL 
AND :date_to IS NOT NULL 
AND emp_no in 
    (SELECT DISTINCT a.emp_no 
     FROM tab1 t, tab2 a, tab3 w 
    WHERE t.company_id = :company_id 
     AND t.template_id = :template_id 
     AND w.company_id = t.company_id 
     AND w.param_id = t.param_id 
     AND a.company_id = t.company_id 
     AND a.param_id = t.param_id 
     AND GREATEST(a.date_from, :date_from) >= :date_from 
     AND a.date_from <= :date_to 
     AND NVL(a.date_to, :date_to) >= :date_from 
    UNION 
    SELECT distinct a.emp_no 
     FROM tab1 t, tab4 a, tab5 d 
    WHERE t.company_id = :company_id 
     AND t.template_id = :template_id 
     AND t.company_id = a.company_id 
     AND t.param_id = a.param_id 
     AND d.company_id = a.company_id 
     AND a.data_deriv_day BETWEEN :date_from AND :date_to) 

Я хочу, чтобы это выполнялось без использования функции REPLACE и использования инструкции USING.

ответ

3

Используйте with положение, чтобы связать переменные первые ...

with bind_val as (
    select 
     :company_id company_id, 
     :template_id template_id, 
     :date_from date_from, 
     :date_to date_to 
    from dual 
) 
SELECT 
    emp_no 
FROM company_tab t 
join bind_val b 
on t.company_id = b.company_id 
where b.template_id IS NOT NULL 
AND b.date_from IS NOT NULL 
AND b.date_to IS NOT NULL 
AND t.emp_no in (
    SELECT 
     DISTINCT a.emp_no 
    FROM tab1 t 
    join bind_val c 
    on t.company_id = c.company_id 
    AND t.template_id = c.template_id 
    join tab3 w 
    on w.company_id = t.company_id 
    AND w.param_id = t.param_id 
    join tab2 a 
    on a.company_id = t.company_id 
    AND a.param_id = t.param_id 

    where GREATEST(a.date_from, c.date_from) >= c.date_from 
    AND a.date_from <= c.date_to 
    AND NVL(a.date_to, c.date_to) >= c.date_from 

    union all 
    ...... 
) 

Теперь у вас есть только 4 переменные связывания, которые могут быть использованы любое количество раз.

Примечание: -
Предпочитаете использовать join вместо ,, чтобы присоединиться к таблице.

Смежные вопросы