Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

no me carga el trigger en la BD

Estas en el tema de no me carga el trigger en la BD en el foro de PostgreSQL en Foros del Web. hola bueno resulta que estoy tratando de colocar esta funcion en mi BD, que es para validar un rut de chile pero la ejecuta y ...
  #1 (permalink)  
Antiguo 16/12/2010, 16:56
Avatar de sublevar  
Fecha de Ingreso: diciembre-2010
Mensajes: 29
Antigüedad: 13 años, 11 meses
Puntos: 1
no me carga el trigger en la BD

hola bueno resulta que estoy tratando de colocar esta funcion en mi BD, que es para validar un rut de chile pero la ejecuta y me sale que la consulta se realizó con existo pero la funcion no carga en la bd, la ejecuta de nuevo y me deberia dar el error de que ya esta creada, este es el codigo nose que estoy haceindo mal

CREATE OR REPLACE FUNCTION "digito_verificador"(varchar)
RETURNS char AS $BODY$
DECLARE
rut ALIAS FOR $1;
rut_cero varchar(8);
valor int;
BEGIN
valor := 0;
rut_cero := lpad(rut,8,'0');

valor := valor + (substring(rut_cero,8,1)::int8)*2;
valor := valor + (substring(rut_cero,7,1)::int8)*3;
valor := valor + (substring(rut_cero,6,1)::int8)*4;
valor := valor + (substring(rut_cero,5,1)::int8)*5;
valor := valor + (substring(rut_cero,4,1)::int8)*6;
valor := valor + (substring(rut_cero,3,1)::int8)*7;
valor := valor + (substring(rut_cero,2,1)::int8)*2;
valor := valor + (substring(rut_cero,1,1)::int8)*3;

valor := valor % 11;

IF valor =1 THEN
RETURN 'K';
END IF;
IF valor =0 THEN
RETURN '0';
END IF;
IF valor>1 AND valor<11 THEN
RETURN (11-valor)::char;
END IF;
END;$BODY$
LANGUAGE plpgsql VOLATILE;

ALTER FUNCTION "digito_verificador"(varchar) OWNER TO formacio;

CREATE OR REPLACE FUNCTION "valida_rut"(varchar)
RETURNS bool AS $BODY$
DECLARE
rutfull ALIAS FOR $1;
rutfull_cero varchar(9);
rut varchar(8);
dv char;
BEGIN
IF rutfull IS NULL THEN
RETURN TRUE;
END IF;

rutfull_cero := lpad(rutfull,9,'0');
rut:= substr(rutfull_cero,0,9);
dv := substr(rutfull_cero,9,1);

IF digito_verificador(rut)=upper(dv) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;$BODY$
LANGUAGE plpgsql VOLATILE;

ALTER FUNCTION "valida_rut"(varchar) OWNER TO formacio;

saludos!
  #2 (permalink)  
Antiguo 17/12/2010, 07:48
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 2 meses
Puntos: 7
Respuesta: no me carga el trigger en la BD

Hola.

Estás definiendo tu función como:
CREATE OR REPLACE FUNCTION

Para lo que la documentación[0] es "CREATE OR REPLACE FUNCTION will either create a new function, or replace an existing definition"

[0]http://www.postgresql.org/docs/8.3/interactive/sql-createfunction.html
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 17/12/2010, 09:27
Avatar de sublevar  
Fecha de Ingreso: diciembre-2010
Mensajes: 29
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: no me carga el trigger en la BD

pucha igual estoy como recien en esto voy a averiguarlo en la documentacion, porque no te entendí mucho,,,
pero igual garcias por responder

pd: si me podrias dar una explicacion mejor please
  #4 (permalink)  
Antiguo 17/12/2010, 09:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: no me carga el trigger en la BD

Lo que te dice cacr es que cuando utilizas la clausula OR REPLACE FUNCTION sobreescribe la función ya existente. Por lo que no tiene porque darte error.

Una cosa es que la función no se cree bien... que esté bien sintactica y semanticamente pero eso no quiere decir que haga lo que estas esperando.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 17/12/2010, 15:34
Avatar de sublevar  
Fecha de Ingreso: diciembre-2010
Mensajes: 29
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: no me carga el trigger en la BD

gracias huesos52 por tu respuesta, pero sabes que no me resulta, me gustaria saber porque cuando creo una funcion

CREATE FUNCTION trg_valida_rut()
RETURNS boolean AS
$BODY$
declare...

retornado falso o verdadero,,, no queda guardada la funcion donde estan las funciones, en cambio cuando la creo de esta manera

CREATE FUNCTION trg_valida_rut()
RETURNS "trigger" AS
$BODY$
declare

retornando NEW,,, ahi si queda y puedo llamarla de cualquier table

la cosa es que con boolean varchar no me resulta nose que hago mal leo el material y no lo comprendo porfa si me puedes ayudar vale please

saludos!!

:(
  #6 (permalink)  
Antiguo 18/12/2010, 18:50
Avatar de sublevar  
Fecha de Ingreso: diciembre-2010
Mensajes: 29
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: no me carga el trigger en la BD

bueno sigo con esta funcion sin resultados ya descubrí donde me almace las funciones y que me crea 2 pero ahora tengo el drama de que no puedo hacer la llamada esta son mis funciones


CREATE OR REPLACE FUNCTION digito_verificador(character varying)
RETURNS character AS
$BODY$
DECLARE
rut ALIAS FOR $1;
rut_cero varchar(8);
valor int;
BEGIN
valor := 0;
rut_cero := lpad(rut,8,'0');

valor := valor + (substring(rut_cero,8,1)::int8)*2;
valor := valor + (substring(rut_cero,7,1)::int8)*3;
valor := valor + (substring(rut_cero,6,1)::int8)*4;
valor := valor + (substring(rut_cero,5,1)::int8)*5;
valor := valor + (substring(rut_cero,4,1)::int8)*6;
valor := valor + (substring(rut_cero,3,1)::int8)*7;
valor := valor + (substring(rut_cero,2,1)::int8)*2;
valor := valor + (substring(rut_cero,1,1)::int8)*3;

valor := valor % 11;

IF valor =1 THEN
RETURN 'K';
END IF;
IF valor =0 THEN
RETURN '0';
END IF;
IF valor>1 AND valor<11 THEN
RETURN (11-valor)::char;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION digito_verificador(character varying) OWNER TO postgres;

CREATE OR REPLACE FUNCTION valida_rut(character varying)
RETURNS boolean AS
$BODY$
DECLARE
rutfull ALIAS FOR $1;
rutfull_cero varchar(9);
rut varchar(8);
dv char;
BEGIN
IF rutfull IS NULL THEN
RETURN TRUE;
END IF;

rutfull_cero := lpad(rutfull,9,'0');
rut:= substr(rutfull_cero,0,9);
dv := substr(rutfull_cero,9,1);

IF digito_verificador(rut)=upper(dv) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION valida_rut(character varying) OWNER TO postgres;

y hago la llamada con este trigger pero no me funca


CREATE OR REPLACE FUNCTION validacionRut()
RETURNS trigger AS
$BODY$
declare validaRut varchar(9);
BEGIN
select rut from persona into validaRut;
if(valida_rut(validaRut)= false) then
raise exception 'rut invalido';
end if;
RETURN NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION validacionRut() OWNER TO postgres;


si alguien me da una mano seria de mucha ayuda

saludos!
  #7 (permalink)  
Antiguo 20/12/2010, 00:26
Avatar de sublevar  
Fecha de Ingreso: diciembre-2010
Mensajes: 29
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: no me carga el trigger en la BD

ya!! descubrí como es el asunto,,, me costo pero aprendí a utilizar las funciones, nadie me ayudó porque pienso que sabian que no sabia para donde iba la micro, no era malo un empujon hacia lo correcto, lo que hice fue modificar la funcion valida_rut para lo que necesitaba,,, saludos
si alguien tiene el mismo problema aqui les dejo como lo hice saludos!!

CREATE OR REPLACE FUNCTION valida_rut(varchar(9),_hola varchar(12))
RETURNS character varying AS
$BODY$
DECLARE
rutfull ALIAS FOR $1;
rutfull_cero varchar(9);
rut varchar(8);
dv char;
BEGIN
IF rutfull IS NULL THEN
RETURN TRUE;
END IF;

rutfull_cero := lpad(rutfull,9,'0');
rut:= substr(rutfull_cero,0,9);
--raise notice '%', rutfull_cero;
dv := substr(rutfull_cero,9,1);

IF digito_verificador(rut)=upper(dv) THEN
--raise notice '%', digito_verificador(rut);
insert into persona
values(
rutfull,
_hola
);
RETURN (rutfull);
ELSE
raise exception 'rut invalido';
--RETURN 0;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION valida_rut(varchar(9),_hola varchar(12)) OWNER TO postgres;

espero que esto ayude a otra alma desconcertada jejejeje

Etiquetas: bd, carga, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:21.