Re: returned more than one row

Lists: pgsql-es-ayuda
From: "juan jose dominguez" <preguntas_sql(at)hotmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: returned more than one row
Date: 2006-05-01 10:17:15
Message-ID: BAY23-F17AB106812286D56878DE783B10@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Buenas tengo las siguientes tablas:

--DROP TABLE codigos_provincia;

CREATE TABLE codigos_provincia
(
codigo numeric NOT NULL,
provincia char(25)
) ;

INSERT INTO codigos_provincia VALUES (01,'Álava');
INSERT INTO codigos_provincia VALUES (02,'Albacete');
INSERT INTO codigos_provincia VALUES (03,'Alicante');
...

Y:

DROP TRIGGER trigger_comprueba_cp ON mitabla;
DROP FUNCTION comprueba_cp () ;

CREATE FUNCTION comprueba_cp () RETURNS OPAQUE AS'
DECLARE
n_aux NUMERIC;
BEGIN
IF (NEW.micodigo) ISNULL THEN RAISE EXCEPTION ''El código no puede ser
nulo'';
END IF;

IF (NEW.miprovincia) ISNULL THEN RAISE EXCEPTION ''La provincia no puede
ser nula'';
END IF;

n_aux := n_aux / 1000;

SELECT codigos_provincia.codigo INTO n_aux FROM codigos_provincia WHERE
NEW.miprovincia = codigos_provincia.provincia;
IF (n_aux = codigos_provincia.codigo) THEN RAISE NOTICE ''Codigo postal %
corresponde a la provincia %'', NEW.micodigo, NEW.miprovincia;
ELSE RAISE EXCEPTION ''Codigo postal % NO corresponde a la provincia %'',
NEW.micodigo, NEW.miprovincia;
END IF;

RETURN NEW;
END;
'LANGUAGE 'plpgsql';

CREATE TRIGGER trigger_comprueba_cp BEFORE INSERT OR UPDATE ON mitabla
FOR EACH ROW EXECUTE PROCEDURE comprueba_cp ();

Y me da el siguiente error al insertar:
INSERT INTO mitabla VALUES (28080, 'Madrid', 'Juan');

ERROR: query "SELECT ( $1 = codigos_provincia.codigo)" returned more than
one row
CONTEXT: PL/pgSQL function "comprueba_cp" line 13 at if

Tiene que comprobar que el codigo que inserto se corresponde con la
provincia, pero solo hay un codigo para cada provincia, el select solo
devuelve una celda... que puedo hacer?

GRACIAS!

_________________________________________________________________
Dale rienda suelta a tu tiempo libre. Mil ideas para exprimir tu ocio con
MSN Entretenimiento. http://entretenimiento.msn.es/


From: Martin Marques <martin(at)bugs(dot)unl(dot)edu(dot)ar>
To: juan jose dominguez <preguntas_sql(at)hotmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: returned more than one row
Date: 2006-05-01 15:59:37
Message-ID: cabd65bb2e74daebac12c56c26c57db5@localhost
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


On Mon, 01 May 2006 12:17:15 +0200, "juan jose dominguez" <preguntas_sql(at)hotmail(dot)com> wrote:
>
> CREATE TABLE codigos_provincia
> (
> codigo numeric NOT NULL,
> provincia char(25)
> ) ;

Te recomendaria colocar un PRIMARY KEY a la tabla (mas aun, a todas las tablas).

> CREATE FUNCTION comprueba_cp () RETURNS OPAQUE AS'

Si es una funcion de trigger, hace que devuelva tipo de dato TRIGGER:

CREATE FUNCTION comprueba_cp () RETURNS TRIGGER AS'

> DECLARE
> n_aux NUMERIC;
> BEGIN
> IF (NEW.micodigo) ISNULL THEN RAISE EXCEPTION ''El código no puede ser
> nulo'';
> END IF;
>
> IF (NEW.miprovincia) ISNULL THEN RAISE EXCEPTION ''La provincia no puede
> ser nula'';
> END IF;
>
> n_aux := n_aux / 1000;

Esto no lo entiendo. A esta altura n_aux no esta definida, por lo tanto cual es la gracia de hacer una operacion matematica con ella?

> SELECT codigos_provincia.codigo INTO n_aux FROM codigos_provincia WHERE
> NEW.miprovincia = codigos_provincia.provincia;
> IF (n_aux = codigos_provincia.codigo) THEN RAISE NOTICE ''Codigo postal %

Claro, pero que es codigos_provincia.codigo? Efectivamente es el valor de n_aux. Nuevamente no entiendo lo que queres hacer aca.

> Y me da el siguiente error al insertar:
> INSERT INTO mitabla VALUES (28080, 'Madrid', 'Juan');
>
> ERROR: query "SELECT ( $1 = codigos_provincia.codigo)" returned more

Esta es la consulta que esta fallando. Y con justa razon, ya que codigos_provincia.codigo te devuelve todos los codigos de la tabla.

Prueba de escribir en el psql la consulta "SELECT codigos_provincia.codigo" y ve el resultado.

> Tiene que comprobar que el codigo que inserto se corresponde con la
> provincia, pero solo hay un codigo para cada provincia, el select solo
> devuelve una celda... que puedo hacer?

Tenes que repenzar la funcion. Yo empezaria de cero con ella.

--
---------------------------------------------------------
Lic. Martín Marqués | SELECT 'mmarques' ||
Centro de Telemática | '@' || 'unl.edu.ar';
Universidad Nacional | DBA, Programador,
del Litoral | Administrador
---------------------------------------------------------


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Martin Marques <martin(at)bugs(dot)unl(dot)edu(dot)ar>
Cc: juan jose dominguez <preguntas_sql(at)hotmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: returned more than one row
Date: 2006-05-01 16:16:15
Message-ID: 20060501161615.GC6927@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Martin Marques escribió:

> > Tiene que comprobar que el codigo que inserto se corresponde con la
> > provincia, pero solo hay un codigo para cada provincia, el select solo
> > devuelve una celda... que puedo hacer?
>
> Tenes que repenzar la funcion. Yo empezaria de cero con ella.

No solo la funcion, sino quizas la definicion de las tablas.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.