[pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función...
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ísescribió: > 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...
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...
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...
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...
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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