Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/04/2007, 06:37
cacr
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: problema insertando la secuencia correcta en tipo de datos serial

Saludos

Cita:
Iniciado por mariovargascareaga Ver Mensaje
tengo la sgte tabla...
tasas
serial character
cod_tasa|descrip
----------------
1 |porcentaje anual
2 |porcentaje mensual
3 |porcentaje trimestral

la funcion para ingresar un nuevo registro es la sgte:

CREATE OR REPLACE FUNCTION alt_tasa( des1 bpchar)
RETURNS void AS
$BODY$declare
begin
INSERT INTO tasas
(descrip)
VALUES
(des1);
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION alt_tasa( des1 bpchar) OWNER TO postgres;
Hasta aquí...

Código:
pruebas=# CREATE TABLE tasas (cod_tasa serial, descrip varchar(5));
NOTICE:  CREATE TABLE creará una secuencia implícita «tasas_cod_tasa_seq» para la columna serial «tasas.cod_tasa»
CREATE TABLE

pruebas=# INSERT INTO tasas (descrip) VALUES ('anual');
INSERT 0 1
pruebas=# INSERT INTO tasas (descrip) VALUES ('mens');
INSERT 0 1
pruebas=# INSERT INTO tasas (descrip) VALUES ('semes');
INSERT 0 1

pruebas=# SELECT * FROM tasas;
 cod_tasa | descrip
----------+-------------
        1 | anual
        2 | mens
        3 | semes
(3 filas)

pruebas=# CREATE OR REPLACE FUNCTION alt_tasa( des1 bpchar)
pruebas-# RETURNS void AS
pruebas-# $BODY$declare
pruebas$# begin
pruebas$# INSERT INTO tasas
pruebas$# (descrip)
pruebas$# VALUES
pruebas$# (des1);
pruebas$# end;
pruebas$# $BODY$
pruebas-# LANGUAGE 'plpgsql' VOLATILE;
CREATE FUNCTION
pruebas=# ALTER FUNCTION alt_tasa( des1 bpchar) OWNER TO postgres;
ALTER FUNCTION

pruebas=# SELECT alt_tasa('porc');
 alt_tasa
----------

(1 fila)

pruebas=# SELECT * FROM tasas;
 cod_tasa | descrip
----------+---------
        1 | anual
        2 | mens
        3 | semes
        4 | porc
(4 filas)
La función, copie y pegue... como veras, me funciona sin problemas...

Cita:
Iniciado por mariovargascareaga Ver Mensaje
cuando ejecuto la funcion select alt_tasa('porcentaje semestral') me sale el sgte error.....
ERROR: duplicate key violates unique constraint "cod_tasa"
Estado SQL:23505
Contexto:SQL statement "INSERT INTO tasas (descrip) VALUES ($1)"
PL/pgSQL function "alt_uni" line 7 at SQL statement

por lo que lei esto no deberia ocurrir porque deberia insertarnos el numero que sigue en nuestra secuencia en este caso 4 pero como sabemos el error pasa porq al tratar de ingresar el campo cod_tasa que es de tipo serial obviamente esta tomando el valor de 1 si lo ejecuto nuevamente tomara el valor 2 y me dara el mismo error
raro... algo demás debes estar haciendo que no estás comentando...
Cita:
Iniciado por mariovargascareaga Ver Mensaje
modifique el insert

INSERT INTO tasas
(cod_tasa,descrip)
VALUES
(nextval('tasas_cod_tasa_seq'),des1);
aquí, sí hay un error... y distinto al que mencionas más adelante... sí ejecutas tal cual, debería botar:

ERROR: no existe la columna «des1»

ya que el segundo parámetro está esperando un varchar, y no es lo que le estás pasando... corrigiendo:

Código:
pruebas=# INSERT INTO tasas
pruebas-# (cod_tasa,descrip)
pruebas-# VALUES
pruebas-# (nextval('tasas_cod_tasa_seq'),'des1');
INSERT 0 1
pruebas=# SELECT * FROM tasas;
 cod_tasa | descrip
----------+---------
        1 | anual
        2 | mens
        3 | semes
        4 | porc
        5 | des1
(5 filas)
donde se ve, que funciona perfectamente...

Cita:
Iniciado por mariovargascareaga Ver Mensaje
y me sigue haciendo exactamente lo mismo sigue empezando de 1..
COmo puedo hacer para que mi campo serial ingrese apartir del ultimo registro?
es decir en este caso 4
ayuda porfa es urgente... gracias
Urgente? haberlo dicho antes... son 35€
__________________
Gracias de todas todas
-----
Linux!