From: | Miguel Rodríguez Penabad <penabad(at)gmail(dot)com> |
---|---|
To: | "Diego Ayala" <netdiego81(at)gmail(dot)com> |
Cc: | "Postgres Ayuda" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: ayuda con ejecucion de funcion |
Date: | 2008-07-23 16:08:15 |
Message-ID: | 95335e4e0807230908k624709exf3c667365dba617e@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El día 23 de julio de 2008 16:40, Diego Ayala <netdiego81(at)gmail(dot)com> escribió:
> buenos dias listeros, tengo una consulta q quiero hacerles, tengo una
> funcion, q recibe varios parametros, con diferentes tipos de datos, esta
> funcion lo unico q debe hacer es insertar los datos que le llegan de los
> parametros dentro de una tabla, pero al ejecutar la funcion, recibo un
> mensaje de conversión de tipos.
A mi esto me lleva a pensar que para que quieres la función (en mi
opinión para nada, pero puede haber algún motivo).
> esta es mi funcion al pasarle los parametros.
>
> select sige_db.f_insert_tbl_expedientewf(1000,5000,2008, '1',2,2, 2, 8,
> current_date,'2', 51, 1, 1, 0, 0)
>
> este es el error q obtengo al ejecutar..
>
> ERROR: no existe la función sige_db.f_insert_tbl_expedientewf(integer,
> integer, integer, unknown, integer, integer, integer, integer, date,
> unknown, integer, integer, integer, integer, integer)
> LINE 1: select sige_db.f_insert_tbl_expedientewf(1000,5000,2008, '1'...
El problema es que al llamar a la función sin hacer "cast" explícito
de los tipos, Postgres interpreta,
por ejemplo, que el primer parámetro (1000) es un integer, y en la
definición de tus funciones no hay ninguna
que coincida.
Mira este ejemplo:
penabad=> create table t1(a bigint, b varchar(20), c smallint);
CREATE TABLE
penabad=> create or replace function ins_t1(_a bigint,_b varchar, _c smallint)
returns void as $$
begin
insert into t1 values(_a,_b,_c);
end
$$ language plpgsql;
CREATE FUNCTION
Ahora tratamos de usar la función, y obtenemos un error
penabad=> select ins_t1(1000,'1',3);
ERROR: no existe la función ins_t1(integer, unknown, integer)
LINEA 1: select ins_t1(1000,'1',3);
^
HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede desear
agregar conversión explícita de tipos.
Hacemos un cast del primer parámetro como bigint, pero seguimos con errores
penabad=> select ins_t1(1000::bigint,'1',3);
ERROR: no existe la función ins_t1(bigint, unknown, integer)
LINEA 1: select ins_t1(1000::bigint,'1',3);
^
HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede desear
agregar conversión explícita de tipos.
Hacemos cast de los dos parámetros numéricos, y ahora sí que funciona
penabad=> select ins_t1(1000::bigint,'1',3::smallint);
ins_t1
--------
(1 fila)
Así que supongo que la solución es usar estos casts.
Pero yo sigo pensando: ¿para qué quieres una función así?
¿para asuntos de seguridad usando "security definer" en la definición
de la función?
Un saludo
--
Miguel Rodríguez Penabad
From | Date | Subject | |
---|---|---|---|
Next Message | Diego Ayala | 2008-07-23 16:14:21 | Re: ayuda con ejecucion de funcion |
Previous Message | Jaime Casanova | 2008-07-23 16:05:36 | Re: EnterpriseDB Tuning Wizard |