[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función...

2016-08-26 Por tema José Hurtado
Hola,
Esta sería una opción sin hacer llamada recursiva:

CREATE OR REPLACE FUNCTION public.reversa
(
  IN  origen  integer
)
RETURNS integer AS
$$
DECLARE
  resultado integer;
BEGIN
  resultado := 0;
  WHILE (origen > 0)
  LOOP
resultado := (resultado * 10) + (origen % 10);
origen := origen / 10;
  END LOOP;
  return resultado;
END;
$$
LANGUAGE 'plpgsql';

Un saludo.

El 26 de agosto de 2016, 3:13, Daymel Bonne Solís 
escribió:

> Hola Carlos:
>
> Aquí un ejemplo. Usando una simple función recursiva:
>
> CREATE OR REPLACE FUNCTION reverse_order(var int8, rest int8)
>   RETURNS pg_catalog.int8 AS
> $BODY$
> DECLARE
>   inverted int8;
> BEGIN
> if var=0 then
> inverted:=rest;
> else
> inverted:=reverse_order(var/10, rest * 10 + var % 10);
> end if;
> return inverted;
> END
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE COST 100
> ;
>
> select public.reverse_order(1589,0);
>
> Saludos
>
> El jue., 25 ago. 2016 a las 19:43, Carlos T. Groero Carmona (<
> cton...@gmail.com>) escribió:
>
>> Hola lista, ante todo gracias por cualquier comentario o sugerencia...
>> Tengo esta función que tiene como parámetro de entrada un número, y luego
>> devuelve ese número invertido...ejemplo...entro el 531 y tiene que devolver
>> el 135, la función o ejercicio tiene como principal características que no
>> puedo usar ningún tipo de función o tipo de dato para cadena...solo puedo
>> usar tipos de datos y funciones numéricas...ya la hice...y cuando la
>> debugeo me funciona bien, pero cuando la ejecuto me devuelve este error:
>>
>> ERROR:  invalid input syntax for integer: "31."
>> CONTEXT:  PL/pgSQL function some_user.reverse_order(integer) line 18 at
>> assignment
>>
>> la función es la siguiente...
>>
>> CREATE OR REPLACE FUNCTION some_user.reverse_order (
>>   var integer
>> )
>> RETURNS integer AS'
>> DECLARE
>> var_lgh integer ;
>> var_div integer :=$1::integer;
>> var_s integer :=1;
>> result_e integer:=0;
>> tf BOOLEAN := true;
>> var_x integer;
>> lth integer :=trunc(log($1))+1;
>> -- variable_name datatype;
>> BEGIN
>> if $1>0 then
>> BEGIN
>> WHILE tf LOOP
>> var_x:=lth-var_s;
>> var_lgh:=div(var_div,power(10.0,var_x)); -- dividendo
>> result_e:=result_e+var_lgh*power(10,var_s-1);
>> var_div:=mod(var_div,power(10.0,var_x)); -- resto
>>
>> var_s:=var_s+1;
>> IF var_s>lth THEN
>> tf:=false;
>> end if;
>> END loop;
>> END;
>> ELSE
>> IF $1=0 THEN
>> RAISE NOTICE ''The entered parameter is zero, please provide a
>> greater than zero value.'';
>> ELSE
>> RAISE EXCEPTION ''The entered parameter is less than zero,
>> please provide a greater than zero value.'';
>> end if;
>>end if;
>>  return result_e::integer;
>> END;
>> 'LANGUAGE 'plpgsql'
>> VOLATILE
>> CALLED ON NULL INPUT
>> SECURITY INVOKER
>> COST 100;
>>
>> una vez más gracias por cualquier comentario...
>>
>> Carlos
>>
>


Re: [pgsql-es-ayuda] Ayuda con función...

2016-08-25 Por tema Gerardo Herzig
1) Creo que tu profesor de "bases de datos" se quedo en Pascal.
2) Con que argumento estas invocando a esta funcion?

- Mensaje original -
> De: "Carlos T. Groero Carmona" <cton...@gmail.com>
> Para: "Lista PostgreSql" <pgsql-es-ayuda@postgresql.org>
> Enviados: Jueves, 25 de Agosto 2016 21:42:38
> Asunto: [pgsql-es-ayuda] Ayuda con función...
> 
> 
> Hola lista, ante todo gracias por cualquier comentario o
> sugerencia...
> Tengo esta función que tiene como parámetro de entrada un número, y
> luego devuelve ese número invertido...ejemplo...entro el 531 y tiene
> que devolver el 135, la función o ejercicio tiene como principal
> características que no puedo usar ningún tipo de función o tipo de
> dato para cadena...solo puedo usar tipos de datos y funciones
> numéricas...ya la hice...y cuando la debugeo me funciona bien, pero
> cuando la ejecuto me devuelve este error:
> 
> 
> ERROR: invalid input syntax for integer: "31."
> CONTEXT: PL/pgSQL function some_user.reverse_order(integer) line 18
> at assignment
> 
> 
> la función es la siguiente...
> 
> 
> 
> CREATE OR REPLACE FUNCTION some_user.reverse_order (
> var integer
> )
> RETURNS integer AS'
> DECLARE
> var_lgh integer ;
> var_div integer :=$1::integer;
> var_s integer :=1;
> result_e integer:=0;
> tf BOOLEAN := true;
> var_x integer;
> lth integer :=trunc(log($1))+1;
> -- variable_name datatype;
> BEGIN
> if $1>0 then
> BEGIN
> WHILE tf LOOP
> var_x:=lth-var_s;
> var_lgh:=div(var_div,power(10.0,var_x)); -- dividendo
> result_e:=result_e+var_lgh*power(10,var_s-1);
> var_div:=mod(var_div,power(10.0,var_x)); -- resto
> var_s:=var_s+1;
> IF var_s>lth THEN
> tf:=false;
> end if;
> END loop;
> 
> END;
> ELSE
> IF $1=0 THEN
> RAISE NOTICE ''The entered parameter is zero, please provide a
> greater than zero value.'';
> ELSE
> RAISE EXCEPTION ''The entered parameter is less than zero, please
> provide a greater than zero value.'';
> end if;
> end if;
> return result_e::integer;
> END;
> 'LANGUAGE 'plpgsql'
> VOLATILE
> CALLED ON NULL INPUT
> SECURITY INVOKER
> COST 100;
> 
> 
> una vez más gracias por cualquier comentario...
> 
> 
> Carlos

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] Ayuda con función...

2016-08-25 Por tema Anthony Sotolongo
Hola Carlos, el error creo que te dice que ese valor no es válido para 
un INTEGER,


y eso significa  que debes hacer un casteo a INTEGER en algunas o todas 
estas lineas siguientes, pues en ella hay funciones que no devuelven 
INTEGER y eso puede generar que se quede algun numeric o algun otro tipo 
distinto de integer:


* var_lgh:=div(var_div,power(10.0,var_x))::integer; -- dividendo**
** result_e:=result_e+var_lgh*power(10,var_s-1)::integer; **
** var_div:=mod(var_div,power(10.0,var_x))::integer; -- resto *


Saludos
On 25/08/16 21:42, Carlos T. Groero Carmona wrote:

Hola lista, ante todo gracias por cualquier comentario o sugerencia...
Tengo esta función que tiene como parámetro de entrada un número, y 
luego devuelve ese número invertido...ejemplo...entro el 531 y tiene 
que devolver el 135, la función o ejercicio tiene como principal 
características que no puedo usar ningún tipo de función o tipo de 
dato para cadena...solo puedo usar tipos de datos y funciones 
numéricas...ya la hice...y cuando la debugeo me funciona bien, pero 
cuando la ejecuto me devuelve este error:


ERROR:  invalid input syntax for integer: "31."
CONTEXT:  PL/pgSQL function some_user.reverse_order(integer) line 18 
at assignment


la función es la siguiente...

CREATE OR REPLACE FUNCTION some_user.reverse_order (
  var integer
)
RETURNS integer AS'
DECLARE
var_lgh integer ;
var_div integer :=$1::integer;
var_s integer :=1;
result_e integer:=0;
tf BOOLEAN := true;
var_x integer;
lth integer :=trunc(log($1))+1;
-- variable_name datatype;
BEGIN
if $1>0 then
BEGIN
WHILE tf LOOP
var_x:=lth-var_s;
var_lgh:=div(var_div,power(10.0,var_x)); -- dividendo
result_e:=result_e+var_lgh*power(10,var_s-1);
var_div:=mod(var_div,power(10.0,var_x)); -- resto
var_s:=var_s+1;
IF var_s>lth THEN
tf:=false;
end if;
END loop;
END;
ELSE
IF $1=0 THEN
RAISE NOTICE ''The entered parameter is zero, please provide a greater 
than zero value.'';

ELSE
RAISE EXCEPTION ''The entered parameter is less than zero, please 
provide a greater than zero value.'';

end if;
   end if;
 return result_e::integer;
END;
'LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

una vez más gracias por cualquier comentario...

Carlos




[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función...

2016-08-25 Por tema Daymel Bonne Solís
Hola Carlos:

Aquí un ejemplo. Usando una simple función recursiva:

CREATE OR REPLACE FUNCTION reverse_order(var int8, rest int8)
  RETURNS pg_catalog.int8 AS
$BODY$
DECLARE
  inverted int8;
BEGIN
if var=0 then
inverted:=rest;
else
inverted:=reverse_order(var/10, rest * 10 + var % 10);
end if;
return inverted;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;

select public.reverse_order(1589,0);

Saludos

El jue., 25 ago. 2016 a las 19:43, Carlos T. Groero Carmona (<
cton...@gmail.com>) escribió:

> Hola lista, ante todo gracias por cualquier comentario o sugerencia...
> Tengo esta función que tiene como parámetro de entrada un número, y luego
> devuelve ese número invertido...ejemplo...entro el 531 y tiene que devolver
> el 135, la función o ejercicio tiene como principal características que no
> puedo usar ningún tipo de función o tipo de dato para cadena...solo puedo
> usar tipos de datos y funciones numéricas...ya la hice...y cuando la
> debugeo me funciona bien, pero cuando la ejecuto me devuelve este error:
>
> ERROR:  invalid input syntax for integer: "31."
> CONTEXT:  PL/pgSQL function some_user.reverse_order(integer) line 18 at
> assignment
>
> la función es la siguiente...
>
> CREATE OR REPLACE FUNCTION some_user.reverse_order (
>   var integer
> )
> RETURNS integer AS'
> DECLARE
> var_lgh integer ;
> var_div integer :=$1::integer;
> var_s integer :=1;
> result_e integer:=0;
> tf BOOLEAN := true;
> var_x integer;
> lth integer :=trunc(log($1))+1;
> -- variable_name datatype;
> BEGIN
> if $1>0 then
> BEGIN
> WHILE tf LOOP
> var_x:=lth-var_s;
> var_lgh:=div(var_div,power(10.0,var_x)); -- dividendo
> result_e:=result_e+var_lgh*power(10,var_s-1);
> var_div:=mod(var_div,power(10.0,var_x)); -- resto
>
> var_s:=var_s+1;
> IF var_s>lth THEN
> tf:=false;
> end if;
> END loop;
> END;
> ELSE
> IF $1=0 THEN
> RAISE NOTICE ''The entered parameter is zero, please provide a
> greater than zero value.'';
> ELSE
> RAISE EXCEPTION ''The entered parameter is less than zero, please
> provide a greater than zero value.'';
> end if;
>end if;
>  return result_e::integer;
> END;
> 'LANGUAGE 'plpgsql'
> VOLATILE
> CALLED ON NULL INPUT
> SECURITY INVOKER
> COST 100;
>
> una vez más gracias por cualquier comentario...
>
> Carlos
>


[pgsql-es-ayuda] Ayuda con función...

2016-08-25 Por tema Carlos T. Groero Carmona
Hola lista, ante todo gracias por cualquier comentario o sugerencia...
Tengo esta función que tiene como parámetro de entrada un número, y luego
devuelve ese número invertido...ejemplo...entro el 531 y tiene que devolver
el 135, la función o ejercicio tiene como principal características que no
puedo usar ningún tipo de función o tipo de dato para cadena...solo puedo
usar tipos de datos y funciones numéricas...ya la hice...y cuando la
debugeo me funciona bien, pero cuando la ejecuto me devuelve este error:

ERROR:  invalid input syntax for integer: "31."
CONTEXT:  PL/pgSQL function some_user.reverse_order(integer) line 18 at
assignment

la función es la siguiente...

CREATE OR REPLACE FUNCTION some_user.reverse_order (
  var integer
)
RETURNS integer AS'
DECLARE
var_lgh integer ;
var_div integer :=$1::integer;
var_s integer :=1;
result_e integer:=0;
tf BOOLEAN := true;
var_x integer;
lth integer :=trunc(log($1))+1;
-- variable_name datatype;
BEGIN
if $1>0 then
BEGIN
WHILE tf LOOP
var_x:=lth-var_s;
var_lgh:=div(var_div,power(10.0,var_x)); -- dividendo
result_e:=result_e+var_lgh*power(10,var_s-1);
var_div:=mod(var_div,power(10.0,var_x)); -- resto

var_s:=var_s+1;
IF var_s>lth THEN
tf:=false;
end if;
END loop;
END;
ELSE
IF $1=0 THEN
RAISE NOTICE ''The entered parameter is zero, please provide a greater
than zero value.'';
ELSE
RAISE EXCEPTION ''The entered parameter is less than zero, please
provide a greater than zero value.'';
end if;
   end if;
 return result_e::integer;
END;
'LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

una vez más gracias por cualquier comentario...

Carlos


[pgsql-es-ayuda] Ayuda con función y refcursor

2013-10-09 Por tema Gunnar Mauricio Lopez Gonzalez
Buenas noches comunidad,

Soy nuevo utilizando postgreSQL y tengo un problema con una función:

CREATE OR REPLACE FUNCTION SC_TEST.fn_seleccionarmaterial(refcursor,
pm_codigoacceso character varying)
  RETURNS refcursor AS
$BODY$
begin

OPEN $1 for SELECT
CO_FechaIngreso,CO_Procedencia,CO_Titulo,CO_Autor
,CO_Editorial,CO_Signatura,CO_Inscripcion,CO_CodigoAcceso,CO_Tipo,CO_Estado
 FROM SC_TCU.TA_Material WHERE CO_CodigoAcceso =
'pm_codigoacceso';
return $1;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION SC_TEST.fn_seleccionarmaterial(refcursor, character
varying) OWNER TO postgres;

A la hora de que ejecuto la sentencia:

select SC_TCU.fn_seleccionarmaterial('refcursor', 'codigo');
FETCH ALL IN  refcursor;

No me muestra ningún valor, aún cuando la palabla codigo satisfaga la
búsqueda.

Hay algo malo en mi función?

Gracias de antemano.
Saludos,
-- 
M/\U


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Miguel Angel Hernandez Moreno
Hola

creao que tienes que hacer el

select * from act_depre_cuentas('01');
as
(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)


o lo que puedes hacer es



CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
  RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
tipo_datoN)  AS


...
..

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



Asi lo resolvi alguna vez, espero te pueda servir

Saludos



El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo 
trib...@gmail.com escribió:

 buen día lista

 estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya he
 pasando las funciones que retornan valores escalares sin ningún problema.

 ahora estoy empezando a migrar las funciones que retornan conjuntos de
 registros y me he encontrado con un problema, me dice que debo definir cada
 columna que voy a retornar.

 esta es la primera función que intente migrar:

 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
   RETURNS setof record AS
 $BODY$
 begin

 return query SELECT   codcia_hed,substring(referen1_hed from 11 for 6) as
 codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
 cnttran.referen1_hed,
  cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
 cntdeta.numcta_det,
   cntdeta.centro_det, cntdeta.debito_det,
 cntdeta.credito_det, cntdeta.debcre_det,
  (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
 numcta_cat=numcta_det) as cuenta,
 (select descri_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as activo,
  (select descri_dep from actdepa where codcia_dep=codcia_hed and
 coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
  (select descri_tip from acttipo where codcia_tip=codcia_hed and
 tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)))as tipo,
  (select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
 (select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
  FROM cntdeta INNER JOIN
   cnttran ON cntdeta.codcia_det = cnttran.codcia_hed
 AND cntdeta.idTrand_det = cnttran.idTran_hed
  where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;

 end;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;

 cuando la creo el resultado es: Query returned successfully with no result
 in 13 ms.

 pero cuando la llamo:
 select * from act_depre_cuentas('01');

 el resultado es:
 ERROR: la lista de definición de columnas es obligatoria para funciones
 que retornan «record»
 SQL state: 42601
 Character: 15

 He estado buscando en foros y me dicen que debo definir cada parámetro en
 el RETURNS o crear un type personalizado con todos los registros que quiero
 retornar.

 Hacer esto me tomaría muchísimo tiempo ya que tengo funciones que retornan
 querys con muchísimas columnas.

 Mi pregunta es,¿Hay alguna forma de retornar el query sin tener que
 definir todas las columnas??




-- 
ISC Miguel Angel Hernandez Moreno


[pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Dario Andres Almonte Alonzo
buen día lista

estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya he
pasando las funciones que retornan valores escalares sin ningún problema.

ahora estoy empezando a migrar las funciones que retornan conjuntos de
registros y me he encontrado con un problema, me dice que debo definir cada
columna que voy a retornar.

esta es la primera función que intente migrar:

CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
  RETURNS setof record AS
$BODY$
begin

return query SELECT   codcia_hed,substring(referen1_hed from 11 for 6) as
codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
cnttran.referen1_hed,
cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
cntdeta.numcta_det,
  cntdeta.centro_det, cntdeta.debito_det,
cntdeta.credito_det, cntdeta.debcre_det,
(select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
numcta_cat=numcta_det) as cuenta,
(select descri_act from actmaes where codcia_act=codcia_hed and codart_act=
substring(referen1_hed from 11 for 6)) as activo,
(select descri_dep from actdepa where codcia_dep=codcia_hed and
coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed and
codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
(select descri_tip from acttipo where codcia_tip=codcia_hed and
tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed and
codart_act= substring(referen1_hed from 11 for 6)))as tipo,
(select coddep_act from actmaes where codcia_act=codcia_hed and codart_act=
substring(referen1_hed from 11 for 6)) as coddep_act,
(select tipart_act from actmaes where codcia_act=codcia_hed and codart_act=
substring(referen1_hed from 11 for 6)) as tipart_act
FROM cntdeta INNER JOIN
  cnttran ON cntdeta.codcia_det = cnttran.codcia_hed
AND cntdeta.idTrand_det = cnttran.idTran_hed
where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

cuando la creo el resultado es: Query returned successfully with no result
in 13 ms.

pero cuando la llamo:
select * from act_depre_cuentas('01');

el resultado es:
ERROR: la lista de definición de columnas es obligatoria para funciones que
retornan «record»
SQL state: 42601
Character: 15

He estado buscando en foros y me dicen que debo definir cada parámetro en
el RETURNS o crear un type personalizado con todos los registros que quiero
retornar.

Hacer esto me tomaría muchísimo tiempo ya que tengo funciones que retornan
querys con muchísimas columnas.

Mi pregunta es,¿Hay alguna forma de retornar el query sin tener que definir
todas las columnas??


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Dario Andres Almonte Alonzo
A eso es que me refería, siempre tengo que indicar cada columna que voy a
retornar de una u otra forma y es bastante tedioso cuando tienes funciones
que retornan hasta 50 columnas.

A lo que me refiero es si no hay forma de evitar eso como en SQL server
donde solo haces:

create funtion prueba(codcia varchar(2))
returns table
as
return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id=t2.id2)


en postgres obligatoriamente tendria que hacer:

create or replace funtion prueba(codcia varchar(2))
returns table(campo01 integer,campo05 text)
as
$BODY$
return query select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id
=t2.id2;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


o me puedo evitar la definición de columnas???


El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno 
miguel.hdz@gmail.com escribió:

 Hola

 creao que tienes que hacer el

 select * from act_depre_cuentas('01');
 as
 (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)


 o lo que puedes hacer es



 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
   RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
 tipo_datoN)  AS


 ...
 ..

 end;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;



 Asi lo resolvi alguna vez, espero te pueda servir

 Saludos



 El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo 
 trib...@gmail.com escribió:

 buen día lista

 estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya
 he pasando las funciones que retornan valores escalares sin ningún problema.

 ahora estoy empezando a migrar las funciones que retornan conjuntos de
 registros y me he encontrado con un problema, me dice que debo definir cada
 columna que voy a retornar.

 esta es la primera función que intente migrar:

 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
   RETURNS setof record AS
 $BODY$
 begin

 return query SELECT   codcia_hed,substring(referen1_hed from 11 for 6) as
 codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
 cnttran.referen1_hed,
  cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
 cntdeta.numcta_det,
   cntdeta.centro_det, cntdeta.debito_det,
 cntdeta.credito_det, cntdeta.debcre_det,
  (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
 numcta_cat=numcta_det) as cuenta,
 (select descri_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as activo,
  (select descri_dep from actdepa where codcia_dep=codcia_hed and
 coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
  (select descri_tip from acttipo where codcia_tip=codcia_hed and
 tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)))as tipo,
  (select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
 (select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
  FROM cntdeta INNER JOIN
   cnttran ON cntdeta.codcia_det = cnttran.codcia_hed
 AND cntdeta.idTrand_det = cnttran.idTran_hed
  where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;

 end;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;

 cuando la creo el resultado es: Query returned successfully with no
 result in 13 ms.

 pero cuando la llamo:
 select * from act_depre_cuentas('01');

 el resultado es:
 ERROR: la lista de definición de columnas es obligatoria para funciones
 que retornan «record»
 SQL state: 42601
 Character: 15

 He estado buscando en foros y me dicen que debo definir cada parámetro en
 el RETURNS o crear un type personalizado con todos los registros que quiero
 retornar.

 Hacer esto me tomaría muchísimo tiempo ya que tengo funciones que
 retornan querys con muchísimas columnas.

 Mi pregunta es,¿Hay alguna forma de retornar el query sin tener que
 definir todas las columnas??




 --
 ISC Miguel Angel Hernandez Moreno



Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Arcel Labrada Batista
si lo que quieres retornar es la estructura de una de las tablas de tu BD no 
hay problema, solo pones
create or replace funtion prueba(codcia varchar(2))
returns setof table
as ..

y listo, pero si no es la estructura de una de tus tablas debes crear un tipo 
de datos como te comentaban anteriormente

- Mensaje original -

De: Dario Andres Almonte Alonzo trib...@gmail.com
Para: Juan smalltalker.marc...@gmail.com
CC: Miguel Angel Hernandez Moreno miguel.hdz@gmail.com, 
pgsql-es-ayuda pgsql-es-ayuda@postgresql.org
Enviados: Jueves, 5 de Septiembre 2013 11:42:15
Asunto: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con 
función retornando registros


Si esa opción ya la había visto.


Lo que quería saber es si se podía retornar la tabla sin tener que definir 
nada, igual que en SQL Server para ahorrar algo de tiempo ya que son muchísimas 
funciones.





El 5 de septiembre de 2013 11:39, Juan  smalltalker.marc...@gmail.com  
escribió:


Holas


Se me ocurrre si creas un tipo con los nombres y tipos de tu salida,
podriasa poner as setof MyTypo
y problema solucionado, ojo!!! especulo, no lo probé.

salu2
jmdc

2013/9/5 Dario Andres Almonte Alonzo  trib...@gmail.com :


 A eso es que me refería, siempre tengo que indicar cada columna que voy a
 retornar de una u otra forma y es bastante tedioso cuando tienes funciones
 que retornan hasta 50 columnas.

 A lo que me refiero es si no hay forma de evitar eso como en SQL server
 donde solo haces:

 create funtion prueba(codcia varchar(2))
 returns table
 as
 return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id =t2.id2)


 en postgres obligatoriamente tendria que hacer:

 create or replace funtion prueba(codcia varchar(2))
 returns table(campo01 integer,campo05 text)
 as
 $BODY$
 return query select t1.campo01,t2.campo05 from t1 inner join t2 on
 ti.id =t2.id2;
 $BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;


 o me puedo evitar la definición de columnas???


 El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno
  miguel.hdz@gmail.com  escribió:

 Hola

 creao que tienes que hacer el

 select * from act_depre_cuentas('01');
 as
 (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)


 o lo que puedes hacer es



 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
 RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
 tipo_datoN) AS


 ...
 ..

 end;
 $BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;



 Asi lo resolvi alguna vez, espero te pueda servir

 Saludos



 El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo
  trib...@gmail.com  escribió:

 buen día lista

 estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya
 he pasando las funciones que retornan valores escalares sin ningún problema.

 ahora estoy empezando a migrar las funciones que retornan conjuntos de 
 registros y me he encontrado con un problema, me dice que debo definir cada
 columna que voy a retornar.

 esta es la primera función que intente migrar:

 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
 RETURNS setof record AS
 $BODY$
 begin

 return query SELECT codcia_hed,substring(referen1_hed from 11 for 6) as
 codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
 cnttran.referen1_hed,
 cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
 cntdeta.numcta_det,
 cntdeta.centro_det, cntdeta.debito_det,
 cntdeta.credito_det, cntdeta.debcre_det,
 (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
 numcta_cat=numcta_det) as cuenta,
 (select descri_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as activo,
 (select descri_dep from actdepa where codcia_dep=codcia_hed and
 coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
 (select descri_tip from acttipo where codcia_tip=codcia_hed and
 tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)))as tipo,
 (select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
 (select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
 FROM cntdeta INNER JOIN
 cnttran ON cntdeta.codcia_det = cnttran.codcia_hed
 AND cntdeta.idTrand_det = cnttran.idTran_hed
 where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;

 end;
 $BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;

 cuando la creo el resultado es: Query returned successfully with no
 result in 13 ms.

 pero cuando la llamo:
 select * from act_depre_cuentas('01');

 el resultado es:
 ERROR: la lista de definición de columnas es obligatoria para funciones
 que retornan «record»
 SQL state: 42601
 Character: 15

 He estado

[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Juan
Holas


Se me ocurrre si creas un tipo con los nombres y tipos de tu salida,
podriasa poner as setof MyTypo
y problema solucionado, ojo!!!  especulo, no lo probé.

salu2
jmdc

2013/9/5 Dario Andres Almonte Alonzo trib...@gmail.com:
 A eso es que me refería, siempre tengo que indicar cada columna que voy a
 retornar de una u otra forma y es bastante tedioso cuando tienes funciones
 que retornan hasta 50 columnas.

 A lo que me refiero es si no hay forma de evitar eso como en SQL server
 donde solo haces:

 create funtion prueba(codcia varchar(2))
 returns table
 as
 return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id=t2.id2)


 en postgres obligatoriamente tendria que hacer:

 create or replace funtion prueba(codcia varchar(2))
 returns table(campo01 integer,campo05 text)
 as
 $BODY$
 return query select t1.campo01,t2.campo05 from t1 inner join t2 on
 ti.id=t2.id2;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;


 o me puedo evitar la definición de columnas???


 El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno
 miguel.hdz@gmail.com escribió:

 Hola

 creao que tienes que hacer el

 select * from act_depre_cuentas('01');
 as
 (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)


 o lo que puedes hacer es



 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
   RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
 tipo_datoN)  AS


 ...
 ..

 end;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;



 Asi lo resolvi alguna vez, espero te pueda servir

 Saludos



 El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo
 trib...@gmail.com escribió:

 buen día lista

 estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya
 he pasando las funciones que retornan valores escalares sin ningún problema.

 ahora estoy empezando a migrar las funciones que retornan conjuntos de
 registros y me he encontrado con un problema, me dice que debo definir cada
 columna que voy a retornar.

 esta es la primera función que intente migrar:

 CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
   RETURNS setof record AS
 $BODY$
 begin

 return query SELECT   codcia_hed,substring(referen1_hed from 11 for 6) as
 codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
 cnttran.referen1_hed,
 cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
 cntdeta.numcta_det,
   cntdeta.centro_det, cntdeta.debito_det,
 cntdeta.credito_det, cntdeta.debcre_det,
 (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
 numcta_cat=numcta_det) as cuenta,
 (select descri_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as activo,
 (select descri_dep from actdepa where codcia_dep=codcia_hed and
 coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
 (select descri_tip from acttipo where codcia_tip=codcia_hed and
 tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)))as tipo,
 (select coddep_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
 (select tipart_act from actmaes where codcia_act=codcia_hed and
 codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
 FROM cntdeta INNER JOIN
   cnttran ON cntdeta.codcia_det = cnttran.codcia_hed
 AND cntdeta.idTrand_det = cnttran.idTran_hed
 where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;

 end;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;

 cuando la creo el resultado es: Query returned successfully with no
 result in 13 ms.

 pero cuando la llamo:
 select * from act_depre_cuentas('01');

 el resultado es:
 ERROR: la lista de definición de columnas es obligatoria para funciones
 que retornan «record»
 SQL state: 42601
 Character: 15

 He estado buscando en foros y me dicen que debo definir cada parámetro en
 el RETURNS o crear un type personalizado con todos los registros que quiero
 retornar.

 Hacer esto me tomaría muchísimo tiempo ya que tengo funciones que
 retornan querys con muchísimas columnas.

 Mi pregunta es,¿Hay alguna forma de retornar el query sin tener que
 definir todas las columnas??




 --
 ISC Miguel Angel Hernandez Moreno



-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Dario Andres Almonte Alonzo
Si esa opción ya la había visto.

Lo que quería saber es si se podía retornar la tabla sin tener que definir
nada, igual que en SQL Server para ahorrar algo de tiempo ya que son
muchísimas funciones.



El 5 de septiembre de 2013 11:39, Juan smalltalker.marc...@gmail.comescribió:

 Holas


 Se me ocurrre si creas un tipo con los nombres y tipos de tu salida,
 podriasa poner as setof MyTypo
 y problema solucionado, ojo!!!  especulo, no lo probé.

 salu2
 jmdc

 2013/9/5 Dario Andres Almonte Alonzo trib...@gmail.com:
  A eso es que me refería, siempre tengo que indicar cada columna que voy a
  retornar de una u otra forma y es bastante tedioso cuando tienes
 funciones
  que retornan hasta 50 columnas.
 
  A lo que me refiero es si no hay forma de evitar eso como en SQL server
  donde solo haces:
 
  create funtion prueba(codcia varchar(2))
  returns table
  as
  return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id
 =t2.id2)
 
 
  en postgres obligatoriamente tendria que hacer:
 
  create or replace funtion prueba(codcia varchar(2))
  returns table(campo01 integer,campo05 text)
  as
  $BODY$
  return query select t1.campo01,t2.campo05 from t1 inner join t2 on
  ti.id=t2.id2;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
 
  o me puedo evitar la definición de columnas???
 
 
  El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno
  miguel.hdz@gmail.com escribió:
 
  Hola
 
  creao que tienes que hacer el
 
  select * from act_depre_cuentas('01');
  as
  (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)
 
 
  o lo que puedes hacer es
 
 
 
  CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character
 varying(2))
RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
  tipo_datoN)  AS
 
 
  ...
  ..
 
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
 
 
  Asi lo resolvi alguna vez, espero te pueda servir
 
  Saludos
 
 
 
  El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo
  trib...@gmail.com escribió:
 
  buen día lista
 
  estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya
  he pasando las funciones que retornan valores escalares sin ningún
 problema.
 
  ahora estoy empezando a migrar las funciones que retornan conjuntos de
  registros y me he encontrado con un problema, me dice que debo definir
 cada
  columna que voy a retornar.
 
  esta es la primera función que intente migrar:
 
  CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character
 varying(2))
RETURNS setof record AS
  $BODY$
  begin
 
  return query SELECT   codcia_hed,substring(referen1_hed from 11 for 6)
 as
  codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
  cnttran.referen1_hed,
  cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
  cntdeta.numcta_det,
cntdeta.centro_det, cntdeta.debito_det,
  cntdeta.credito_det, cntdeta.debcre_det,
  (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
  numcta_cat=numcta_det) as cuenta,
  (select descri_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as activo,
  (select descri_dep from actdepa where codcia_dep=codcia_hed and
  coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed
 and
  codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
  (select descri_tip from acttipo where codcia_tip=codcia_hed and
  tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed
 and
  codart_act= substring(referen1_hed from 11 for 6)))as tipo,
  (select coddep_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
  (select tipart_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
  FROM cntdeta INNER JOIN
cnttran ON cntdeta.codcia_det =
 cnttran.codcia_hed
  AND cntdeta.idTrand_det = cnttran.idTran_hed
  where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;
 
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
  cuando la creo el resultado es: Query returned successfully with no
  result in 13 ms.
 
  pero cuando la llamo:
  select * from act_depre_cuentas('01');
 
  el resultado es:
  ERROR: la lista de definición de columnas es obligatoria para funciones
  que retornan «record»
  SQL state: 42601
  Character: 15
 
  He estado buscando en foros y me dicen que debo definir cada parámetro
 en
  el RETURNS o crear un type personalizado con todos los registros que
 quiero
  retornar.
 
  Hacer esto me tomaría muchísimo tiempo ya que tengo funciones que
  retornan querys con muchísimas columnas.
 
  Mi pregunta es,¿Hay alguna forma de retornar el query sin tener que
  definir todas las columnas??
 
 
 
 
  --
  ISC Miguel Angel Hernandez Moreno
 
 



[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Miguel Angel Hernandez Moreno
Si retornas la tabla


CREATE FUNCTION getDatos()
RETURNS NOMBRE_TABLA
LANGUAGE sql
AS $_$
select id, texto from prueba;
$_$;


Aqui yo uso el lenguaje SQL y no el PLPGSQL


El 5 de septiembre de 2013 10:42, Dario Andres Almonte Alonzo 
trib...@gmail.com escribió:

 Si esa opción ya la había visto.

 Lo que quería saber es si se podía retornar la tabla sin tener que definir
 nada, igual que en SQL Server para ahorrar algo de tiempo ya que son
 muchísimas funciones.



 El 5 de septiembre de 2013 11:39, Juan 
 smalltalker.marc...@gmail.comescribió:

 Holas


 Se me ocurrre si creas un tipo con los nombres y tipos de tu salida,
 podriasa poner as setof MyTypo
 y problema solucionado, ojo!!!  especulo, no lo probé.

 salu2
 jmdc

 2013/9/5 Dario Andres Almonte Alonzo trib...@gmail.com:
  A eso es que me refería, siempre tengo que indicar cada columna que voy
 a
  retornar de una u otra forma y es bastante tedioso cuando tienes
 funciones
  que retornan hasta 50 columnas.
 
  A lo que me refiero es si no hay forma de evitar eso como en SQL server
  donde solo haces:
 
  create funtion prueba(codcia varchar(2))
  returns table
  as
  return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id
 =t2.id2)
 
 
  en postgres obligatoriamente tendria que hacer:
 
  create or replace funtion prueba(codcia varchar(2))
  returns table(campo01 integer,campo05 text)
  as
  $BODY$
  return query select t1.campo01,t2.campo05 from t1 inner join t2 on
  ti.id=t2.id2;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
 
  o me puedo evitar la definición de columnas???
 
 
  El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno
  miguel.hdz@gmail.com escribió:
 
  Hola
 
  creao que tienes que hacer el
 
  select * from act_depre_cuentas('01');
  as
  (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)
 
 
  o lo que puedes hacer es
 
 
 
  CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character
 varying(2))
RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
  tipo_datoN)  AS
 
 
  ...
  ..
 
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
 
 
  Asi lo resolvi alguna vez, espero te pueda servir
 
  Saludos
 
 
 
  El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo
  trib...@gmail.com escribió:
 
  buen día lista
 
  estoy migrando una base de datos de sql server 2005 a postgres
 9.2.4,ya
  he pasando las funciones que retornan valores escalares sin ningún
 problema.
 
  ahora estoy empezando a migrar las funciones que retornan conjuntos de
  registros y me he encontrado con un problema, me dice que debo
 definir cada
  columna que voy a retornar.
 
  esta es la primera función que intente migrar:
 
  CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character
 varying(2))
RETURNS setof record AS
  $BODY$
  begin
 
  return query SELECT   codcia_hed,substring(referen1_hed from 11 for
 6) as
  codart_act, cnttran.idTran_hed, cnttran.modulo_hed,
 cnttran.codent_hed,
  cnttran.referen1_hed,
  cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
  cntdeta.numcta_det,
cntdeta.centro_det, cntdeta.debito_det,
  cntdeta.credito_det, cntdeta.debcre_det,
  (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
  numcta_cat=numcta_det) as cuenta,
  (select descri_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as activo,
  (select descri_dep from actdepa where codcia_dep=codcia_hed and
  coddep_dep=(select coddep_act from actmaes where
 codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
  (select descri_tip from acttipo where codcia_tip=codcia_hed and
  tipact_tip=(select tipart_act from actmaes where
 codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)))as tipo,
  (select coddep_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
  (select tipart_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
  FROM cntdeta INNER JOIN
cnttran ON cntdeta.codcia_det =
 cnttran.codcia_hed
  AND cntdeta.idTrand_det = cnttran.idTran_hed
  where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;
 
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
  cuando la creo el resultado es: Query returned successfully with no
  result in 13 ms.
 
  pero cuando la llamo:
  select * from act_depre_cuentas('01');
 
  el resultado es:
  ERROR: la lista de definición de columnas es obligatoria para
 funciones
  que retornan «record»
  SQL state: 42601
  Character: 15
 
  He estado buscando en foros y me dicen que debo definir cada
 parámetro en
  el RETURNS o crear un type personalizado con todos los registros que
 quiero
  retornar.
 
  Hacer esto me tomaría muchísimo tiempo ya que 

[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función retornando registros

2013-09-05 Por tema Dario Andres Almonte Alonzo
Bueno pues toco hacerlo como me indic Miguel Angel Hernadez

CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
  RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
tipo_datoN)  AS

Así funciona perfecto

Gracias a todos por sus rápidas respuestas


El 5 de septiembre de 2013 12:05, Miguel Angel Hernandez Moreno 
miguel.hdz@gmail.com escribió:

 Si retornas la tabla


 CREATE FUNCTION getDatos()
 RETURNS NOMBRE_TABLA
 LANGUAGE sql
 AS $_$
 select id, texto from prueba;
 $_$;


 Aqui yo uso el lenguaje SQL y no el PLPGSQL


 El 5 de septiembre de 2013 10:42, Dario Andres Almonte Alonzo 
 trib...@gmail.com escribió:

 Si esa opción ya la había visto.

 Lo que quería saber es si se podía retornar la tabla sin tener que
 definir nada, igual que en SQL Server para ahorrar algo de tiempo ya que
 son muchísimas funciones.



 El 5 de septiembre de 2013 11:39, Juan 
 smalltalker.marc...@gmail.comescribió:

 Holas


 Se me ocurrre si creas un tipo con los nombres y tipos de tu salida,
 podriasa poner as setof MyTypo
 y problema solucionado, ojo!!!  especulo, no lo probé.

 salu2
 jmdc

 2013/9/5 Dario Andres Almonte Alonzo trib...@gmail.com:
  A eso es que me refería, siempre tengo que indicar cada columna que
 voy a
  retornar de una u otra forma y es bastante tedioso cuando tienes
 funciones
  que retornan hasta 50 columnas.
 
  A lo que me refiero es si no hay forma de evitar eso como en SQL server
  donde solo haces:
 
  create funtion prueba(codcia varchar(2))
  returns table
  as
  return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id
 =t2.id2)
 
 
  en postgres obligatoriamente tendria que hacer:
 
  create or replace funtion prueba(codcia varchar(2))
  returns table(campo01 integer,campo05 text)
  as
  $BODY$
  return query select t1.campo01,t2.campo05 from t1 inner join t2 on
  ti.id=t2.id2;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
 
  o me puedo evitar la definición de columnas???
 
 
  El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno
  miguel.hdz@gmail.com escribió:
 
  Hola
 
  creao que tienes que hacer el
 
  select * from act_depre_cuentas('01');
  as
  (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)
 
 
  o lo que puedes hacer es
 
 
 
  CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character
 varying(2))
RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
  tipo_datoN)  AS
 
 
  ...
  ..
 
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
 
 
  Asi lo resolvi alguna vez, espero te pueda servir
 
  Saludos
 
 
 
  El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo
  trib...@gmail.com escribió:
 
  buen día lista
 
  estoy migrando una base de datos de sql server 2005 a postgres
 9.2.4,ya
  he pasando las funciones que retornan valores escalares sin ningún
 problema.
 
  ahora estoy empezando a migrar las funciones que retornan conjuntos
 de
  registros y me he encontrado con un problema, me dice que debo
 definir cada
  columna que voy a retornar.
 
  esta es la primera función que intente migrar:
 
  CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character
 varying(2))
RETURNS setof record AS
  $BODY$
  begin
 
  return query SELECT   codcia_hed,substring(referen1_hed from 11 for
 6) as
  codart_act, cnttran.idTran_hed, cnttran.modulo_hed,
 cnttran.codent_hed,
  cnttran.referen1_hed,
  cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
  cntdeta.numcta_det,
cntdeta.centro_det, cntdeta.debito_det,
  cntdeta.credito_det, cntdeta.debcre_det,
  (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
  numcta_cat=numcta_det) as cuenta,
  (select descri_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as activo,
  (select descri_dep from actdepa where codcia_dep=codcia_hed and
  coddep_dep=(select coddep_act from actmaes where
 codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
  (select descri_tip from acttipo where codcia_tip=codcia_hed and
  tipact_tip=(select tipart_act from actmaes where
 codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)))as tipo,
  (select coddep_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
  (select tipart_act from actmaes where codcia_act=codcia_hed and
  codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
  FROM cntdeta INNER JOIN
cnttran ON cntdeta.codcia_det =
 cnttran.codcia_hed
  AND cntdeta.idTrand_det = cnttran.idTran_hed
  where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;
 
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 
  cuando la creo el resultado es: Query returned successfully with no
  result in 13 ms.
 
  pero cuando la llamo:
  select * from 

Re: [pgsql-es-ayuda] ayuda con función

2011-08-12 Por tema Alvaro Herrera
Excerpts from Virginia's message of vie ago 12 12:28:36 -0400 2011:

 BEGIN
 SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) +
 cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
 cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as resultado;
 RETURN resultado;

Usa INTO, no AS.

-- 
Álvaro Herrera alvhe...@alvh.no-ip.org
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] ayuda con función

2011-08-12 Por tema Virginia
Hola!!!
Cambié el AS por INTO y me da el siguiente error


ERROR:  invalid input syntax for integer: 2.34898380940343
CONTEXT:  PL/pgSQL function calculo_distancia while casting return value
to function's return type

** Error **

ERROR: invalid input syntax for integer: 2.34898380940343
SQL state: 22P02
Context: PL/pgSQL function calculo_distancia while casting return value to
function's return type





El 12 de agosto de 2011 12:45, Alvaro Herrera alvhe...@alvh.no-ip.orgescribió:

 Excerpts from Virginia's message of vie ago 12 12:28:36 -0400 2011:

  BEGIN
  SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) +
  cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
  cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as resultado;
  RETURN resultado;

 Usa INTO, no AS.

 --
 Álvaro Herrera alvhe...@alvh.no-ip.org



[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] ayuda con función

2011-08-12 Por tema Juan
Virginia

CREATE OR REPLACE FUNCTION calculo_distancia(numeric, numeric, numeric, numeric)
  RETURNS integer AS

El numero del resultado seguramente excede el integer  no es integer
es mas grande seguramente
en

CREATE OR REPLACE FUNCTION calculo_distancia(numeric, numeric, numeric, numeric)
  RETURNS double  AS

podria andar sino evalualo en pfgadmin fijate que tipo te da el
resultado ponelo en la funcion ( el tipo)
salu2
mdc
2011/8/12 Virginia mavi...@gmail.com:
 Hola!!!
 Cambié el AS por INTO y me da el siguiente error


 ERROR:  invalid input syntax for integer: 2.34898380940343
 CONTEXT:  PL/pgSQL function calculo_distancia while casting return value
 to function's return type

 ** Error **

 ERROR: invalid input syntax for integer: 2.34898380940343
 SQL state: 22P02
 Context: PL/pgSQL function calculo_distancia while casting return value to
 function's return type





 El 12 de agosto de 2011 12:45, Alvaro Herrera alvhe...@alvh.no-ip.org
 escribió:

 Excerpts from Virginia's message of vie ago 12 12:28:36 -0400 2011:

  BEGIN
      SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) +
      cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
      cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as
  resultado;
      RETURN resultado;

 Usa INTO, no AS.

 --
 Álvaro Herrera alvhe...@alvh.no-ip.org


-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] ayuda con función

2011-08-12 Por tema Rodrigo Gonzalez

On 08/12/2011 03:38 PM, Virginia wrote:

Hola!!!
Cambié el AS por INTO y me da el siguiente error


ERROR:  invalid input syntax for integer: 2.34898380940343
CONTEXT:  PL/pgSQL function calculo_distancia while casting return 
value to function's return type


** Error **

ERROR: invalid input syntax for integer: 2.34898380940343
SQL state: 22P02
Context: PL/pgSQL function calculo_distancia while casting return 
value to function's return type





La funcion esta deinifida para devolver un entero y 2.34898380940343 no 
es un entero, cambia la funcion para devolver float y debiera funcionar


Saludos

Rodrigo Gonzalez
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] ayuda con función

2011-08-12 Por tema Virginia
Gracias!
No me había fijado en que estaba retornando el tipo de dato equivocado



El 12 de agosto de 2011 14:16, Rodrigo Gonzalez
rjgonz...@estrads.com.arescribió:

 On 08/12/2011 03:38 PM, Virginia wrote:

 Hola!!!
 Cambié el AS por INTO y me da el siguiente error


 ERROR:  invalid input syntax for integer: 2.34898380940343
 CONTEXT:  PL/pgSQL function calculo_distancia while casting return value
 to function's return type

 ** Error **

 ERROR: invalid input syntax for integer: 2.34898380940343
 SQL state: 22P02
 Context: PL/pgSQL function calculo_distancia while casting return value
 to function's return type



 La funcion esta deinifida para devolver un entero y 2.34898380940343 no es
 un entero, cambia la funcion para devolver float y debiera funcionar

 Saludos

 Rodrigo Gonzalez



Re: [pgsql-es-ayuda] ayuda con función en C

2011-06-28 Por tema Alvaro Herrera
Excerpts from Anthony's message of lun jun 27 17:53:39 -0400 2011:

 wo, esa solución me funciono, separando las funciones , no sabia que 
 para postgresql  se podia hacer funciones así , como en la documentación 
 solo hablan del uso de las macros esas con el Datum  , que bien gracias.

Sí, en Postgres una función que quieres llamar desde SQL debe tener la
marca PG_FUNCTION_INFO_V1 y retornar usando las macros PG_RETURN_XXX.
Pero durante la ejecución de esa función, puede invocar otras funciones
usando los métodos normales de llamadas a funciones.

Ahora, _es_ posible escribir una función facto() como la que tú tenías
originalmente que se llame a sí misma recursivamente, pero es complicado
y más lento que poner la recursividad en una función aparte, como en el
ejemplo de iescriva.

-- 
Álvaro Herrera alvhe...@alvh.no-ip.org
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] ayuda con función en C

2011-06-28 Por tema Anthony

On 28/06/11 10:47, Alvaro Herrera wrote:

Excerpts from Anthony's message of lun jun 27 17:53:39 -0400 2011:

   

wo, esa solución me funciono, separando las funciones , no sabia que
para postgresql  se podia hacer funciones así , como en la documentación
solo hablan del uso de las macros esas con el Datum  , que bien gracias.
 

Sí, en Postgres una función que quieres llamar desde SQL debe tener la
marca PG_FUNCTION_INFO_V1 y retornar usando las macros PG_RETURN_XXX.
Pero durante la ejecución de esa función, puede invocar otras funciones
usando los métodos normales de llamadas a funciones.

Ahora, _es_ posible escribir una función facto() como la que tú tenías
originalmente que se llame a sí misma recursivamente, pero es complicado
y más lento que poner la recursividad en una función aparte, como en el
ejemplo de iescriva.

   
A que bien eso facilita un poco las cosas y voy entiendo un poco mejor, 
una pregunta ¿la version 0 de programación de funciones en C para 
postgreSQL por que no la recomiendan?, Gracias a ambos

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] ayuda con función en C

2011-06-28 Por tema Alvaro Herrera
Excerpts from Anthony's message of mar jun 28 15:19:37 -0400 2011:
 On 28/06/11 10:47, Alvaro Herrera wrote:
  Excerpts from Anthony's message of lun jun 27 17:53:39 -0400 2011:
 
 
  wo, esa solución me funciono, separando las funciones , no sabia que
  para postgresql  se podia hacer funciones así , como en la documentación
  solo hablan del uso de las macros esas con el Datum  , que bien gracias.
   
  Sí, en Postgres una función que quieres llamar desde SQL debe tener la
  marca PG_FUNCTION_INFO_V1 y retornar usando las macros PG_RETURN_XXX.
  Pero durante la ejecución de esa función, puede invocar otras funciones
  usando los métodos normales de llamadas a funciones.
 
  Ahora, _es_ posible escribir una función facto() como la que tú tenías
  originalmente que se llame a sí misma recursivamente, pero es complicado
  y más lento que poner la recursividad en una función aparte, como en el
  ejemplo de iescriva.

 A que bien eso facilita un poco las cosas y voy entiendo un poco mejor, 
 una pregunta ¿la version 0 de programación de funciones en C para 
 postgreSQL por que no la recomiendan?, Gracias a ambos

Porque está obsoleta ... no tengo muy claros los motivos.  Si te
interesa puedes leer el archivo src/backend/utils/fmgr/README

-- 
Álvaro Herrera alvhe...@alvh.no-ip.org
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] ayuda con función en C

2011-06-27 Por tema iescriva
El 27/06/11 06:14, Anthony escribió:
 /otrasfunciones.c: In function âfactoâ:
 otrasfunciones.c:18: warning: passing argument 1 of âfactoâ makes
 pointer from integer without a cast

Aquí te esta diciendo el compilador que estas creando un puntero desde
un entero. Es por la linea: result = n*facto(n-1); ya que facto espera
un vector y n es un entero.

 otrasfunciones.c:9: note: expected âFunctionCallInfoâ but argument is of
 type âintâ/

Te dice que facto espera un tipo FunctionCallInfo pero le estas
pasando un int.(lo de la linea 18).

La función espera un puntero al vector de argumentos así que al usar el
entero como un puntero accede fuera de su zona de memoria y por eso te
cierra el servidor.

no tienes que pasarle n-1 sino un vecto de argumentos del tipo que
espera facto(supongo que FunctionCallInfo).

Así que necesitarás construir ese vector y utilizarlo en la linea 18.
No tengo mucha experiencia en postgres usando C, yo crearía una función
que espere un entero y calcularía el factorial en ella.

int factorial(int n){
  if(n)
return n*factorial(n-1);
  else
return 1;
}

Datum
facto(PG_FUNCTION_ARGS)
{
   int32 n = PG_GETARG_INT32(0);
   int32 result;
   result=factorial(n)
   PG_RETURN_INT32(result);
}
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] ayuda con función en C

2011-06-27 Por tema Anthony

El 27/06/2011 12:00, iescriva escribió:

El 27/06/11 06:14, Anthony escribió:
   

/otrasfunciones.c: In function âfactoâ:
otrasfunciones.c:18: warning: passing argument 1 of âfactoâ makes
pointer from integer without a cast
 

Aquí te esta diciendo el compilador que estas creando un puntero desde
un entero. Es por la linea: result = n*facto(n-1); ya que facto espera
un vector y n es un entero.

   

otrasfunciones.c:9: note: expected âFunctionCallInfoâ but argument is of
type âintâ/
 

Te dice que facto espera un tipo FunctionCallInfo pero le estas
pasando un int.(lo de la linea 18).

La función espera un puntero al vector de argumentos así que al usar el
entero como un puntero accede fuera de su zona de memoria y por eso te
cierra el servidor.

no tienes que pasarle n-1 sino un vecto de argumentos del tipo que
espera facto(supongo que FunctionCallInfo).

Así que necesitarás construir ese vector y utilizarlo en la linea 18.
No tengo mucha experiencia en postgres usando C, yo crearía una función
que espere un entero y calcularía el factorial en ella.

int factorial(int n){
   if(n)
 return n*factorial(n-1);
   else
 return 1;
}

Datum
facto(PG_FUNCTION_ARGS)
{
int32 n = PG_GETARG_INT32(0);
int32 result;
result=factorial(n)
PG_RETURN_INT32(result);
}
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
   



wo, esa solución me funciono, separando las funciones , no sabia que 
para postgresql  se podia hacer funciones así , como en la documentación 
solo hablan del uso de las macros esas con el Datum  , que bien gracias.

saludos
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


[pgsql-es-ayuda] ayuda con función en C

2011-06-26 Por tema Anthony
Saludos a todos en la lista. Tengo una función  en C programada que 
calcula un factorial (al menos eso creo) con la técnica de recursividad, 
es algo puramente de prueba para aprender sobre como programar en C para 
postgreSQL. Lo hice mirando el manual de PostgreSQL y tiene el código 
siguiente.

el archivo se llama otrasfunciones.c
#include postgres.h
#include fmgr.h
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(facto);
Datum
facto(PG_FUNCTION_ARGS)
{
int32 n = PG_GETARG_INT32(0);
int32 result;

  if (n==0)  // Caso base
 result = 1;
   //Caso general
else// Caso general
 result = n*facto(n-1);




 PG_RETURN_INT32(result);
}

lo compile y me dice esto:

/otrasfunciones.c: In function âfactoâ:
otrasfunciones.c:18: warning: passing argument 1 of âfactoâ makes 
pointer from integer without a cast
otrasfunciones.c:9: note: expected âFunctionCallInfoâ but argument is of 
type âintâ/


Luego la creo dentro de PostgreSQL

/postgres=# create FUNCTION facto (integer) RETURNS integer as 
'/usr/local/pgsql/lib/otrasfunciones.so' ,'facto' LANGUAGE c STRICT;

CREATE FUNCTION/
luego la ejecuto para ver si funciona y sale todo ok
postgres=# select facto(0);
 facto

  1
(1 row)


el problema viene cuando pongo otro valor que no sea 0
por ejemplo
/postgres=# select facto(2);/

me sale  lo siguiente  :-(

/server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed./

Será que no puede ejecutar para postgres algoritmos recursivos  desde 
funciones implementadas en C y agregadas luego o debe hacerse usando una 
técnica especial y lo estoy haciendo mal?


Saludos


[pgsql-es-ayuda] RE: [pgsql-es-ayuda] Ayuda con función r ecord referenciada d esde otra función

2009-04-19 Por tema ALFONSO REYES


Estimadas Lista
Muchas gracias por su ayuda, en especial a Alvaro...
Nuevamente Gracias!!!
 Date: Wed, 15 Apr 2009 13:31:44 -0400
 From: alvhe...@alvh.no-ip.org
 To: alfonsoreyesc...@hotmail.com
 CC: pgsql-es-ayuda@postgresql.org
 Subject: Re: [pgsql-es-ayuda] Ayuda con función record referenciada desde 
 otra función
 
 ALFONSO REYES escribió:
 
 Estimada Lista
 Espero me puedan ayudar indicándome como se debe llamar a una función
 record desde otra función, a continuación coloco las dos funciones 
 
 
 Creo que debe ser algo como esto:
 
 declare
   unidad ...;
   establecimiento ...;
 
 begin;
   bla bla
   select * from danmaf.gen_obt_estab_punto(argumento) into unidad, 
 establecimiento, punto ...
   mas bla bla
 end
 
 -- 
 Alvaro Herrera http://www.flickr.com/photos/alvherre/
 Aprende a avergonzarte más ante ti que ante los demás (Demócrito)
 --
 TIP 8: explain analyze es tu amigo

_
More than messages–check out the rest of the Windows Live™.
http://www.microsoft.com/windows/windowslive/

Re: [pgsql-es-ayuda] Ayuda con función record referenciada desde otra función

2009-04-15 Por tema Alvaro Herrera
ALFONSO REYES escribió:
 
 Estimada Lista
 Espero me puedan ayudar indicándome como se debe llamar a una función
 record desde otra función, a continuación coloco las dos funciones 


Creo que debe ser algo como esto:

declare
unidad ...;
establecimiento ...;

begin;
bla bla
select * from danmaf.gen_obt_estab_punto(argumento) into unidad, 
establecimiento, punto ...
mas bla bla
end

-- 
Alvaro Herrera http://www.flickr.com/photos/alvherre/
Aprende a avergonzarte más ante ti que ante los demás (Demócrito)
--
TIP 8: explain analyze es tu amigo


[pgsql-es-ayuda] RE: [pgsql-es-ayuda] Ayuda con función r ecord referenciada d esde otra función

2009-04-14 Por tema ALFONSO REYES

Estimados
Agradecería me ayuden, ya que quisiera realizar una función para reutilizarla y 
no escribir el mismo sql, cada vez que lo necesite
Nuevamente gracias por su ayuda...
Att Alfonso Reyes
From: alfonsoreyesc...@hotmail.com
To: pgsql-es-ayuda@postgresql.org
Subject: [pgsql-es-ayuda] Ayuda con función record referenciada desde otra 
función
Date: Tue, 14 Apr 2009 02:09:57 +








Estimada Lista
Espero me puedan ayudar indicándome como se debe llamar a una función record 
desde otra función, a continuación coloco las dos funciones 
Cualquier ayuda es bienvenida.
Mil gracias de antemano...
/*** Función record***/
CREATE OR REPLACE FUNCTION danmaf.gen_obt_estab_punto (p_id_empresa 
integer, p_unidad_adm varchar, out p_establecimiento varchar, out p_punto 
varchar, out p_autorizacion varchar) RETURNS record AS$body$DECLARE 
v_establecimiento varchar(3); v_punto varchar(3);BEGIN SELECT 
fa.establecimiento,fa.punto--,fa.autorizacion  into 
v_establecimiento,v_punto  FROM  danmaf.gen_documento 
gd,danmaf.fac_autorizaciones fa  WHERE gd.id_documento=fa.id_documento  
  and gd.nombre='FACTURA'and gd.id_empresa=p_id_empresaand 
fa.cod_unidad=p_unidad_adm;END;$body$LANGUAGE 'plpgsql'VOLATILECALLED ON NULL 
INPUTSECURITY INVOKERCOST 100;/*** Fin Función record***/



/ Función desde la cual se debe 
referenciar*//
CREATE OR REPLACE FUNCTION danmaf.fac_sp_reg_cab_factura (p_id_factura 
integer, p_id_empresa integer, p_num_factura integer, p_fecha_emison date, 
p_fecha_envio date, p_estado char, p_fact_fisica varchar, p_usuario_crea 
varchar, p_subtotal numeric, p_impuestos numeric, p_guia_remision varchar, 
p_obs varchar, p_unidad_adm varchar, p_id_cliente integer, p_cur_resultado 
pg_catalog.refcursor) RETURNS pg_catalog.refcursor AS$body$
declare v_fact_fisica integer;  v_id_factura integer;   v_establecimiento 
varchar(3);v_punto varchar (3);v_autorizacion VARCHAR(32);--
v_num_factura,begin   if p_id_factura is null then
select count(1)  into v_fact_fisica  from 
danmaf.fac_cab_factura cf where cf.fact_fisica=p_fact_fisica   
and cf.id_empresa=p_id_empresa   and cf.unidad_adm=p_unidad_adm;
   if v_fact_fisica=0 then
/*Este sql es el de la función con el record**/ 
SELECT fa.establecimiento,fa.punto,fa.autorizacion  into 
v_establecimiento,v_punto,v_autorizacion  FROM  danmaf.gen_documento 
gd,danmaf.fac_autorizaciones fa  WHERE gd.id_documento=fa.id_documento  
  and gd.nombre='FACTURA'and gd.id_empresa=p_id_empresaand 
fa.cod_unidad=p_unidad_adm;
/*/   
--Aqui ejecuto la  función pero me da error
  --danmaf.gen_obt_estab_punto(p_id_empresa,p_unidad_adm) as 
(v_establecimiento,v_punto,v_autorizacion); --Fin  INSERT INTO 
danmaf.fac_cab_factura( id_empresa,  num_factura,  fecha_emision,   
   fecha_envio,  estado,  fact_fisica,  usuario_crea,  
fecha_crea,  subtotal,  impuestos,  guia_remision,  
autorizacion,  establecimiento,  punto,  obs,  unidad_adm,  
id_cliente) VALUES (  p_id_empresa,  p_num_factura,  
p_fecha_emision,  p_fecha_envio,  p_estado,  
v_establecimiento||v_punto||to_char(p_num_factura),  p_usuario_crea,  
p_fecha_crea,  p_subtotal,  p_impuestos,  p_guia_remision,  
v_autorizacion,   v_establecimiento,  v_punto,  p_obs,  
p_unidad_adm,  p_id_cliente) returning id_factura into 
v_id_factura; open p_cur_resultadoFOR select '-1' 
as codigo,v_id_factura as id_factura,'Información registrada 
satisfactoriamente...'as descripcion;return  p_cur_resultado;  
elseopen p_cur_resultadoFOR select '-1404' as codigo, 'Ya 
existe el número de factura física registrado';return  p_cur_resultado;
end if; elseUPDATE danmaf.fac_cab_factura
SET id_cliente = p_id_cliente,fecha_factura = p_fecha_factura,
fecha_max_cobro = p_fecha_max_cobro,estado = p_estado,
fact_fisica = p_fact_fisicaWHERE id_empresa = p_id_empresaand  
unidad_adm = p_unidad_admand  id_factura = p_id_factura;
open p_cur_resultadoFOR select '-1' as codigo, p_id_factura as 
id_factura,'Información registrada satisfactoriamente...'as descripcion;
return  p_cur_resultado; end if; end;$body$LANGUAGE 
'plpgsql'VOLATILECALLED ON NULL INPUTSECURITY INVOKERCOST 100;

See all the ways you can stay connected to friends and family
_
Invite your mail contacts to join your friends list with Windows Live Spaces. 
It's easy!
http://spaces.live.com

[pgsql-es-ayuda] Ayuda con función re cord referenciada de sde otra función

2009-04-13 Por tema ALFONSO REYES

Estimada Lista
Espero me puedan ayudar indicándome como se debe llamar a una función record 
desde otra función, a continuación coloco las dos funciones 
Cualquier ayuda es bienvenida.
Mil gracias de antemano...
/*** Función record***/
CREATE OR REPLACE FUNCTION danmaf.gen_obt_estab_punto (p_id_empresa 
integer, p_unidad_adm varchar, out p_establecimiento varchar, out p_punto 
varchar, out p_autorizacion varchar) RETURNS record AS$body$DECLARE 
v_establecimiento varchar(3); v_punto varchar(3);BEGIN SELECT 
fa.establecimiento,fa.punto--,fa.autorizacion  into 
v_establecimiento,v_punto  FROM  danmaf.gen_documento 
gd,danmaf.fac_autorizaciones fa  WHERE gd.id_documento=fa.id_documento  
  and gd.nombre='FACTURA'and gd.id_empresa=p_id_empresaand 
fa.cod_unidad=p_unidad_adm;END;$body$LANGUAGE 'plpgsql'VOLATILECALLED ON NULL 
INPUTSECURITY INVOKERCOST 100;/*** Fin Función record***/



/ Función desde la cual se debe 
referenciar*//
CREATE OR REPLACE FUNCTION danmaf.fac_sp_reg_cab_factura (p_id_factura 
integer, p_id_empresa integer, p_num_factura integer, p_fecha_emison date, 
p_fecha_envio date, p_estado char, p_fact_fisica varchar, p_usuario_crea 
varchar, p_subtotal numeric, p_impuestos numeric, p_guia_remision varchar, 
p_obs varchar, p_unidad_adm varchar, p_id_cliente integer, p_cur_resultado 
pg_catalog.refcursor) RETURNS pg_catalog.refcursor AS$body$
declare v_fact_fisica integer;  v_id_factura integer;   v_establecimiento 
varchar(3);v_punto varchar (3);v_autorizacion VARCHAR(32);--
v_num_factura,begin   if p_id_factura is null then
select count(1)  into v_fact_fisica  from 
danmaf.fac_cab_factura cf where cf.fact_fisica=p_fact_fisica   
and cf.id_empresa=p_id_empresa   and cf.unidad_adm=p_unidad_adm;
   if v_fact_fisica=0 then
/*Este sql es el de la función con el record**/ 
SELECT fa.establecimiento,fa.punto,fa.autorizacion  into 
v_establecimiento,v_punto,v_autorizacion  FROM  danmaf.gen_documento 
gd,danmaf.fac_autorizaciones fa  WHERE gd.id_documento=fa.id_documento  
  and gd.nombre='FACTURA'and gd.id_empresa=p_id_empresaand 
fa.cod_unidad=p_unidad_adm;
/*/   
--Aqui ejecuto la  función pero me da error
  --danmaf.gen_obt_estab_punto(p_id_empresa,p_unidad_adm) as 
(v_establecimiento,v_punto,v_autorizacion); --Fin  INSERT INTO 
danmaf.fac_cab_factura( id_empresa,  num_factura,  fecha_emision,   
   fecha_envio,  estado,  fact_fisica,  usuario_crea,  
fecha_crea,  subtotal,  impuestos,  guia_remision,  
autorizacion,  establecimiento,  punto,  obs,  unidad_adm,  
id_cliente) VALUES (  p_id_empresa,  p_num_factura,  
p_fecha_emision,  p_fecha_envio,  p_estado,  
v_establecimiento||v_punto||to_char(p_num_factura),  p_usuario_crea,  
p_fecha_crea,  p_subtotal,  p_impuestos,  p_guia_remision,  
v_autorizacion,   v_establecimiento,  v_punto,  p_obs,  
p_unidad_adm,  p_id_cliente) returning id_factura into 
v_id_factura; open p_cur_resultadoFOR select '-1' 
as codigo,v_id_factura as id_factura,'Información registrada 
satisfactoriamente...'as descripcion;return  p_cur_resultado;  
elseopen p_cur_resultadoFOR select '-1404' as codigo, 'Ya 
existe el número de factura física registrado';return  p_cur_resultado;
end if; elseUPDATE danmaf.fac_cab_factura
SET id_cliente = p_id_cliente,fecha_factura = p_fecha_factura,
fecha_max_cobro = p_fecha_max_cobro,estado = p_estado,
fact_fisica = p_fact_fisicaWHERE id_empresa = p_id_empresaand  
unidad_adm = p_unidad_admand  id_factura = p_id_factura;
open p_cur_resultadoFOR select '-1' as codigo, p_id_factura as 
id_factura,'Información registrada satisfactoriamente...'as descripcion;
return  p_cur_resultado; end if; end;$body$LANGUAGE 
'plpgsql'VOLATILECALLED ON NULL INPUTSECURITY INVOKERCOST 100;

_
Show them the way! Add maps and directions to your party invites. 
http://www.microsoft.com/windows/windowslive/products/events.aspx