Hola,

Se me esta presentando el siguiente problema, Tengo una funcion llamada
pendientes, el llamado de esta funcion la hago de la siguiente forma,

select pendientes('20294');

donde '20294' es un codigo que varia; la funcion trabaja correctamente,
pero si esta es llamada muchas veces obtengo el siguiente error:

ERROR:  no existe la función pendientes(character) en carácter 8
HINT:  Ninguna función coincide en el nombre y tipos de argumentos. Puede
desear agregar conversión explícita de tipos.

SENTENCIA:  SELECT pendientes('20294');

Hice la siguiente prueba para descartar el tipo de argumento, le quite el
argumento a la funcion  y la llame asi:

select pendientes();

Estableciendo como constante internamente '20294' el valor de la variable,
pero obtengo un error similar

ERROR:  no existe la función pendientes() en carácter 8
HINT:  Ninguna función coincide en el nombre y tipos de argumentos. Puede
desear agregar conversión explícita de tipos.
SENTENCIA:  SELECT pendientes();

La funcion es eficiente, retornando el resultado en tiempos que van entre
los 200 a 230 milisegudos como maximo.

Estoy trabajando con un postgresql version 8.4.20, sistema operativo Centos
kernel 2.6.32 y me conecto a postgres por jdbc.

Adjunto procedimiento a continuacion.

CREATE OR REPLACE FUNCTION pendientes(vlr character(5))
  RETURNS character AS
$BODY$
DECLARE
 fila resultadof%ROWTYPE;
 rta text;
BEGIN
     rta:='';

--TEMPORALES
DROP TABLE IF EXISTS vinfo_pedido,vinfo_ppendiente,vdinfo_ppendiente,vinv,
pendientes;

CREATE TEMP TABLE vinfo_pedido(codigo character(5));

INSERT INTO vinfo_pedido VALUES (vlr);
UPDATE vinfo_pedido SET codigo=lpad(codigo,5,'0');

CREATE TEMP TABLE vinfo_ppendiente AS
SELECT
ps.id_prod_serv,
coalesce(sum(pedido),0)-coalesce(sum(despacho),0) AS pendiente
FROM
pendiente p,
documentos d,
prod_serv ps,
vinfo_pedido ip
WHERE
ps.codigo=ip.codigo AND
p.id_prod_serv=ps.id_prod_serv AND
d.ndocumento=p.ndocumentoa AND
p.estado AND
d.estado
GROUP BY
ps.id_prod_serv
HAVING
coalesce(sum(pedido),0)-coalesce(sum(despacho),0)!=0;

CREATE TEMP TABLE vdinfo_ppendiente AS
SELECT
ps.id_prod_serv,
d.fecha::date,
trim(g.nombre1||' '||g.nombre2||' '||g.apellido1||' '||g.apellido2||'
'||g.razon_social) as tercero,
coalesce(sum(pedido),0)-coalesce(sum(despacho),0) AS pendiente
FROM
general g,
tercero_def t,
pendiente p,
documentos d,
prod_serv ps,
vinfo_pedido ip
WHERE
t.ndocumento=d.ndocumento AND
t.id=g.id AND
ps.codigo=ip.codigo AND
p.id_prod_serv=ps.id_prod_serv AND
d.ndocumento=p.ndocumentoa AND
p.estado AND
d.estado
GROUP BY
d.fecha::date,
trim(g.nombre1||' '||g.nombre2||' '||g.apellido1||' '||g.apellido2||'
'||g.razon_social),
ps.id_prod_serv
HAVING
coalesce(sum(pedido),0)-coalesce(sum(despacho),0)!=0;

CREATE TEMP TABLE vinv AS
SELECT DISTINCT ON(p.id_prod_serv)
p.id_prod_serv,
p.cant_minima,
d.ndocumento
FROM
inventarios i,
documentos d,
vinfo_pedido ip,
prod_serv p
WHERE
ip.codigo=p.codigo AND
p.id_prod_serv=i.id_prod_serv AND
d.ndocumento=i.ndocumento AND
(d.codigo_tipo='EA' OR
d.codigo_tipo='RM')
ORDER BY
p.id_prod_serv,
i.fecha DESC,
orden DESC;

DELETE FROM resultadof;
INSERT INTO resultadof
SELECT
pp.fecha,
pp.tercero,
pp.dpendiente AS tpendientes,
'PENDIENTE '||COALESCE(pp.pendiente,0)||' - U.C.
'||COALESCE(g.proveedor,'')||' - Cant. Mínima: '||COALESCE(g.cant_minima,0)
AS pendiente
FROM
(SELECT
pp.id_prod_serv,
dp.fecha,
dp.tercero,
dp.pendiente AS dpendiente,
pp.pendiente
FROM
vdinfo_ppendiente AS dp,
vinfo_ppendiente AS pp
WHERE
dp.id_prod_serv=pp.id_prod_serv) AS pp
FULL OUTER JOIN
(SELECT
i.id_prod_serv,
d.fecha::date||' '||TRIM(g.nombre1||' '||g.nombre2||' '||g.apellido1||'
'||g.apellido2||' '||g.razon_social||' CANT DESPACHADA
'||to_char(dp.cant,'9,999,999.99')) AS proveedor,
i.cant_minima
FROM
documentos d,
datos_prod dp,
tercero_def t,
general g,
vinv AS i
WHERE
dp.ndocumento=i.ndocumento AND
dp.id_prod_serv=i.id_prod_serv AND
i.ndocumento=d.ndocumento AND
t.ndocumento=i.ndocumento AND
t.id=g.id) AS g
ON
g.id_prod_serv=pp.id_prod_serv;
--FUNCION INS

     create temp table pendientes (id_pendiente varchar(20),texto text);

     FOR fila IN SELECT * FROM resultadof
       LOOP
        -- INSERT INTO pendiente VALUES('0',fila.fecha);
         rta:=COALESCE(fila.fecha,current_date)||' -
'||COALESCE(fila.tercero,'NO EXISTEN PENDIENTES A LA FECHA ')||' -
'||COALESCE(fila.tpendientes,0)||'\n'||rta;
     END LOOP;
     rta:=rta||''||fila.pendiente;
     INSERT INTO pendientes VALUES(vlr,rta);
     return rta;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION pendientes(character(5))
  OWNER TO emaku;




LUIS FELIPE HERNANDEZ
PASTO - COLOMBIA

Responder a