带参数的postgres函数和dblink

时间:2017-12-29 12:47:49

标签: postgresql

我要求您提供我需要发送搜索参数的功能的帮助。但问题是该函数是通过DBlink执行的,我需要传递2个值作为搜索参数,并且在执行时不会发送值。

这是没有dblink的函数:

`CREATE OR REPLACE FUNCTION sp_get_afil(i_pers_codigo VARCHAR, i_empr_codigo 
 VARCHAR) RETURNS VARCHAR AS $$
 DECLARE
    v_pers_codigo VARCHAR;
 BEGIN
    select ro.pers_codigo
    into v_pers_codigo
    from unv_roles_personas ro, unv_personas p1, unv_personas p
    where ro.rope_vigente = 'S'
    and ro.empr_codigo = p1.empr_codigo
    and ro.tiro_codigo = 'AFIL'
    and ro.pers_codigo = p1.pers_codigo
    and p1.empr_codigo = p.empr_codigo
    and p1.pers_estado_cae = p.pers_estado_cae
    and p1.pers_numero_cae = p.pers_numero_cae
    and p.empr_codigo = i_empr_codigo
    and p.pers_codigo = i_pers_codigo;

    RETURN v_pers_codigo;

END;
$$ LANGUAGE plpgsql;`

它没有问题,这里功能相同但使用dblink,但不起作用:

`CREATE OR REPLACE FUNCTION sp_get_afil(i_pers_codigo VARCHAR, i_empr_codigo 
 VARCHAR) RETURNS VARCHAR AS $$
 DECLARE
    v_pers_codigo VARCHAR;
    v_empr_codigo VARCHAR;
    vr_pers_codigo VARCHAR;
BEGIN
    select t1.rop_codigo
    into vr_pers_codigo
    from dblink('dbname = usuarios host=100.1.1.138 port=5432 ',
                'select ro.pers_codigo
                from unv_roles_personas ro, unv_personas p1, unv_personas p
                where ro.rope_vigente = ''S''
                and ro.empr_codigo = p1.empr_codigo
                and ro.tiro_codigo = ''AFIL''
                and ro.pers_codigo = p1.pers_codigo
                and p1.empr_codigo = p.empr_codigo
                and p1.pers_estado_cae = p.pers_estado_cae
                and p1.pers_numero_cae = p.pers_numero_cae
                and p.empr_codigo = '||quote_literal ($1)||'
                and p.pers_codigo = '||quote_literal ($2)||'')
     as t1 (rop_codigo character varying);

     RETURN vr_pers_codigo;

 END;
 $$ LANGUAGE plpgsql;`

执行它时,它返回一个空值,这不会生成我需要的视图。我做得很糟糕,我已经调查过,但我已陷入僵局。

2 个答案:

答案 0 :(得分:2)

试试这个:

CREATE OR REPLACE FUNCTION sp_get_afil(i_pers_codigo VARCHAR, i_empr_codigo 
 VARCHAR) RETURNS VARCHAR AS $$
 DECLARE
    v_pers_codigo VARCHAR;
    v_empr_codigo VARCHAR;
    vr_pers_codigo VARCHAR;
BEGIN
    select t1.rop_codigo
    into vr_pers_codigo
    from dblink('dbname = usuarios host=100.1.1.138 port=5432 ',
                format('select ro.pers_codigo
                from unv_roles_personas ro, unv_personas p1, unv_personas p
                where ro.rope_vigente = ''S''
                and ro.empr_codigo = p1.empr_codigo
                and ro.tiro_codigo = ''AFIL''
                and ro.pers_codigo = p1.pers_codigo
                and p1.empr_codigo = p.empr_codigo
                and p1.pers_estado_cae = p.pers_estado_cae
                and p1.pers_numero_cae = p.pers_numero_cae
                and p.empr_codigo = %L
                and p.pers_codigo = %L',i_pers_codigo,i_empr_codigo))
     as t1 (rop_codigo character varying);

     RETURN vr_pers_codigo;

 END;
 $$ LANGUAGE plpgsql;

答案 1 :(得分:0)

感谢Vao Tsun,更改视角并在我访问的数据库一侧交换功能。

enter code here

`select t1.a_ctac_correlativo,
   t1.a_pers_codigo_socadm,
   b.pers_codigo_scd,
   b.pers_sigla,
   b.pers_nombre_completo nombre_soc,
   t1.recl_correlativo,
   d.pers_codigo,
   d.pers_nombre_completo,
   d.pers_nombre_fantasia,
   d.pers_sigla edit_sigla,       
   t1.monto,
   e.tiro_codigo,       
   t1.a_titu_codigo,
   t1.a_ajuc_correlativo
from dblink('dbname = liquidaciones host=100.1.1.138 port=5432 ',
        'select a.ctac_correlativo a_ctac_correlativo,
                a.pers_codigo_socadm a_pers_codigo_socadm,
                (case when a.ctac_correlativo = 1213 then 48 else 
 a.ctac_correlativo end) recl_correlativo,
                sum(redi_monto) monto,
                a.titu_codigo a_titu_codigo,
                a.ajuc_correlativo a_ajuc_correlativo,
                a.pers_codigo a_pers_codigo,
                a.empr_codigo a_empr_codigo
         from redit a
         where a.redi_liquidado =''S''
         and a.redi_correlativo_padre is null
         group by a.ctac_correlativo,
         a.pers_codigo_socadm,
         recl_correlativo,
         a.titu_codigo,
         a.ajuc_correlativo,
         a.pers_codigo,
         a.empr_codigo')
         as t1 (a_ctac_correlativo character varying,
                a_pers_codigo_socadm character varying,
                recl_correlativo character varying,
                monto character varying,
                a_titu_codigo character varying,
                a_ajuc_correlativo character varying,
                a_pers_codigo character varying,
                a_empr_codigo character varying),
    unv_personas b,
    unv_roles_personas e,
    unv_personas d
 where b.pers_codigo = t1.a_pers_codigo_socadm
 and e.empr_codigo = d.empr_codigo
 and e.pers_codigo = d.pers_codigo
 and e.tiro_codigo = 'EDIT'
 and b.pers_codigo = (select sp_get_afil(CASE WHEN t1.a_pers_codigo = 
 '10010407' THEN '10010436' ELSE t1.a_pers_codigo END, t1.a_empr_codigo))
 and t1.a_pers_codigo in (select pers_codigo from unv_roles_personas where 
tiro_codigo = 'MANDAT'
                     INTERSECT
                     select pers_codigo from unv_roles_personas where 
tiro_codigo = 'EDIT')
group by t1.a_ctac_correlativo,
     t1.a_pers_codigo_socadm,
     b.pers_codigo_scd,
     b.pers_sigla,
     nombre_soc,
     t1.recl_correlativo,
     d.pers_codigo,
     d.pers_nombre_completo,
     d.pers_nombre_fantasia,
     edit_sigla,       
     t1.monto,
     e.tiro_codigo,       
     t1.a_titu_codigo,
     t1.a_ajuc_correlativo;`