Re: ayuda con ejecucion de funcion

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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