Re: returned more than one row

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
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 16:07:43
Message-ID: 20060501160743.GA6927@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

juan jose dominguez escribió:
> Buenas tengo las siguientes tablas:
>
>
> --DROP TABLE codigos_provincia;
>
> CREATE TABLE codigos_provincia
> (
> codigo numeric NOT NULL,
> provincia char(25)
> ) ;

Bota eso y crea lo siguiente:

CREATE TABLE codigos_provincia
(
codigo integer not null,
provincia varchar(25) not null
) ;

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

Esto no es necesario -- mejor hace CREATE OR REPLACE FUNCTION mas abajo.

> 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;

Cambia "mitabla" para que "micodigo" sea NOT NULL tambien y te ahorras
esto.

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

Idem aqui, mismo motivo.

> n_aux := n_aux / 1000;

HUH??? Explica esto por favor? Si la idea es tener un campo que
represente dos cosas (el codigo de provincia por una parte y otro
codigo), entonces olvidalo; crea dos campos.

> 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;

Esto muestra que tienes una tabla con un diseño que no esta normalizado,
puesto que tienes que ingresar dos datos y verificar que corresponden.
Esto no esta bien. Elimina el campo mitabla.miprovincia; deja solamente
el codigo de provincia.

> 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');

Humm, esto da la impresion de ser un codigo postal? Quizas lo que te
dije mas arriba no sea apropiado en este caso. Por que no explicas lo
que estas tratando de hacer con ese trigger? Por lo pronto diria que
tienes una ensalada muy confusa de codigo.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-05-01 16:16:15 Re: returned more than one row
Previous Message antonio albiñana crespo 2006-05-01 16:02:06 Re: returned more than one row