使用' USING'在PL / SQL动态语句中绑定多个变量。

时间:2016-01-14 05:06:09

标签: plsql

有一个带有多个绑定变量的动态语句,其中在多个位置使用相同的变量。动态陈述也将根据条件而变化。所以绑定变量的顺序会有所不同

如何绑定特定名称的所有变量?例如。所有: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语句的情况下完成此操作。

1 个答案:

答案 0 :(得分: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代替,来加入表格。