我要求您提供我需要发送搜索参数的功能的帮助。但问题是该函数是通过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;`
执行它时,它返回一个空值,这不会生成我需要的视图。我做得很糟糕,我已经调查过,但我已陷入僵局。
答案 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;`