Postgresql 带参数和dblink的postgres函数

Postgresql 带参数和dblink的postgres函数,postgresql,Postgresql,我请求您对我需要向其发送搜索参数的函数提供帮助。但问题是该函数是通过DBlink执行的,我需要传递2个值作为搜索参数,执行时不会发送值 这是不带dblink的函数: 它可以正常工作,这里的函数与dblink相同,但dblink不起作用: 当执行它时,它返回一个空值,这不会生成我需要的视图。我做得不好,我已经调查过了,但我已经陷入僵局。试试这个: CREATE OR REPLACE FUNCTION sp_get_afil(i_pers_codigo VARCHAR, i_empr_cod

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

这是不带dblink的函数:



它可以正常工作,这里的函数与dblink相同,但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 ',
                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;

感谢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;`

谢谢,不幸的是,这是相同的结果,它返回空值。hm。如果没有可复制的env,很难说为什么会有null。嘿,伙计们,如何在sql语句的where子句中参数化主机名或任何变量?
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;
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;`