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:53:04
Message-ID: BAY23-F16B533F9238ED660E627A983B10@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!

_________________________________________________________________
Moda para esta temporada. Ponte al día de todas las tendencias.
http://www.msn.es/Mujer/moda/default.asp


From: "Julio Rivero" <jcrmlima(at)gmail(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 15:32:56
Message-ID: d34a12b60605010832i261c13aej7e816c4d7109999d@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 5/1/06, juan jose dominguez <preguntas_sql(at)hotmail(dot)com> wrote:
>
> 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 := 0;

n_aux := n_aux / 1000;
>
> SELECT codigos_provincia.codigo INTO n_aux FROM codigos_provincia WHERE
> NEW.miprovincia = codigos_provincia.provincia;

Puedes adicionarle un group by

---

SELECT codigos_provincia.codigo INTO n_aux FROM codigos_provincia WHERE
NEW.miprovincia = codigos_provincia.provincia
GROUP BY codigos_provincia.codigo;

---

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

La consulta esta devolviendo mas de 2 valores (es lo que te esta diciendo).

Puedes hacer un

IF EXISTS (SUBQUERY)
...
ELSE
...
END IF;

Si existe datos en tu subquery el valor del EXISTS te va a devolver TRUE, de
lo contrario haces lo otro.

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!
>
> _________________________________________________________________
> Moda para esta temporada. Ponte al día de todas las tendencias.
> http://www.msn.es/Mujer/moda/default.asp
>
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 9: el optimizador ignorará el uso de recorridos de índice si los
> tipos de datos de las columnas no coinciden
>

--
Saludos
Att,
Julio Rivero
Movil: 98817321


From: antonio albiñana crespo <an_chonio(at)hotmail(dot)com>
To: jcrmlima(at)gmail(dot)com, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: returned more than one row
Date: 2006-05-01 16:02:06
Message-ID: BAY103-F1585D1DC2B508F87E1710793B10@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


Buenas, gracias ante todo, pero yo quiero saber el único valor que puede
devolver, porque solo puede haber una provincia posible, no puede devolver
varias. Lo del IF EXISTS (SUBQUERY)... es para saber si devuelve un único
valor o no? a mi me hace falta que me devuelva ese valor que se que es unico

>From: "Julio Rivero" <jcrmlima(at)gmail(dot)com>
>To: "juan jose dominguez" <preguntas_sql(at)hotmail(dot)com>
>CC: pgsql-es-ayuda(at)postgresql(dot)org
>Subject: Re: [pgsql-es-ayuda] returned more than one row
>Date: Mon, 1 May 2006 10:32:56 -0500
>
>On 5/1/06, juan jose dominguez <preguntas_sql(at)hotmail(dot)com> wrote:
>>
>>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 := 0;
>
>n_aux := n_aux / 1000;
>>
>>SELECT codigos_provincia.codigo INTO n_aux FROM codigos_provincia WHERE
>>NEW.miprovincia = codigos_provincia.provincia;
>
>
>Puedes adicionarle un group by
>
>---
>
>SELECT codigos_provincia.codigo INTO n_aux FROM codigos_provincia WHERE
>NEW.miprovincia = codigos_provincia.provincia
>GROUP BY codigos_provincia.codigo;
>
>---
>
>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
>
>
>La consulta esta devolviendo mas de 2 valores (es lo que te esta diciendo).
>
>Puedes hacer un
>
>IF EXISTS (SUBQUERY)
>...
>ELSE
>...
>END IF;
>
>Si existe datos en tu subquery el valor del EXISTS te va a devolver TRUE,
>de
>lo contrario haces lo otro.
>
>
>
>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!
>>
>>_________________________________________________________________
>>Moda para esta temporada. Ponte al día de todas las tendencias.
>>http://www.msn.es/Mujer/moda/default.asp
>>
>>
>>---------------------------(fin del mensaje)---------------------------
>>TIP 9: el optimizador ignorará el uso de recorridos de índice si los
>> tipos de datos de las columnas no coinciden
>>
>
>
>
>--
>Saludos
>Att,
>Julio Rivero
>Movil: 98817321

_________________________________________________________________
Acepta el reto MSN Premium: Protección para tus hijos en internet.
Descárgalo y pruébalo 2 meses gratis.
http://join.msn.com?XAPID=1697&DI=1055&HL=Footer_mailsenviados_proteccioninfantil


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