Re: PL/pgSQL und FOUND (erledigt)

Lists: pgsql-de-allgemein
From: Thomas Zuberbuehler <sa(at)zubi(dot)li>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: PL/pgSQL und FOUND
Date: 2005-12-29 11:58:04
Message-ID: 43B3CF4C.9050702@zubi.li
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Grüezi ;-)

Ich habe ein Problem mit PL/pgSQL und der Variablen FOUND. Folgendes
klappt bei mir nicht:

...
PERFORM * FROM person WHERE name = 'Florian';
IF NOT FOUND THEN
...
ELSE
...
END IF;
...

-------------------------------------------------------------------------

Ich habe mal die ganze Funktion gepostet:

BEGIN;

CREATE
FUNCTION geonames.update_or_create_metadata(BIGINT, INTEGER, TEXT,
TEXT, TEXT)
RETURNS void AS $BODY$

DECLARE

geoobj ALIAS FOR $1;
mt ALIAS FOR $2;
inf ALIAS FOR $3;
s ALIAS FOR $4;
d ALIAS FOR $5;

ret TEXT;

BEGIN

PERFORM md.information
FROM geonames.metadata md
WHERE (md.fid_geoobject = geoobj) AND (md.fid_metatype = mt);

IF NOT FOUND THEN
EXECUTE 'INSERT INTO geonames.metadata VALUES ( ' || geoobj || ',
' || mt || ', ''' || inf || ''', ''' || s || ''', ''' || d ||''');';
ELSE
EXECUTE 'UPDATE geonames.metadata SET information = ''' ||
inf || ''', source = ''' || s || ''', dateofcapture =
''' || d || ''' WHERE (fid_geoobject = ' ||
geoobj || ') AND (fid_metatype = ' || mt || ');';
END IF;

RETURN;

END;
$BODY$ LANGUAGE plpgsql;

COMMIT;

-------------------------------------------------------------------------

Die Tabelle:

CREATE TABLE geonames.metadata (

fid_metatype INTEGER,
fid_geoobject BIGINT,

information TEXT NOT NULL,
source TEXT,
dateofcapture TEXT,

PRIMARY KEY (fid_geoobject, fid_metatype),

FOREIGN KEY (fid_metatype) REFERENCES geonames.metatype
ON DELETE CASCADE,
FOREIGN KEY (fid_geoobject) REFERENCES geonames.geoobject
ON DELETE CASCADE

);

-------------------------------------------------------------------------

Eigendlich sollte folgenden Aufruf keinen Error geben, da ja UPDATE und
nicht INSERT aufgerufen werden:

SELECT geonames.update_or_create_metadata(16, 22, 'xyz', 'b', '');

ERROR: duplicate key violates unique constraint "metadata_pkey"
KONTEXT: SQL statement "INSERT INTO geonames.metadata VALUES ( 16, 22,
'xyz', 'b', '');"
PL/pgSQL function "update_or_create_metadata" line 19 at execute statement

-------------------------------------------------------------------------

Ich hoffe jemand kann mir helfen? Ich bin ziemlich ratlos und nach 2
Stunden recherche am Ende meines Lateins. SELECT INTO klappt bei mir
leider ebenfalls nicht.

Vielen Dank bereits im Voraus.
Freundliche Grüsse
Thomas Zuberbühler

--
Thomas Zuberbühler
http://www.zubi.li

______________________________________________________________________
>> GPS Access for Java, http://www.gafj.net, http://gafj.tigris.org <<

--
Thomas Zuberbühler
http://www.zubi.li

______________________________________________________________________
>> GPS Access for Java, http://www.gafj.net, http://gafj.tigris.org <<


From: Andreas Seltenreich <andreas+pg(at)gate450(dot)dyndns(dot)org>
To: Thomas Zuberbuehler <sa(at)zubi(dot)li>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: PL/pgSQL und FOUND
Date: 2005-12-29 12:18:46
Message-ID: 87bqz014gp.fsf@gate450.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Thomas Zuberbuehler writes:

> EXECUTE 'INSERT INTO geonames.metadata VALUES ( ' || geoobj || ',
> ' || mt || ', ''' || inf || ''', ''' || s || ''', ''' || d ||''');';

Hmm, sind hier geoobj und mt vertauscht?

> CREATE TABLE geonames.metadata (
>
> fid_metatype INTEGER,
> fid_geoobject BIGINT,

Gruß
Andreas


From: Thomas Zuberbuehler <sa(at)zubi(dot)li>
To: Andreas Seltenreich <andreas+pg(at)gate450(dot)dyndns(dot)org>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: PL/pgSQL und FOUND (erledigt)
Date: 2005-12-29 12:33:36
Message-ID: 43B3D7A0.9020404@zubi.li
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Salü Andreas

Vielen Dank für deine schnelle Hilfe. Ich habe die beiden wirklich
vertauscht.. Du hast meinen Tag gerettet! ;-)

Wünsche Dir einen guten Rutsch ins neue Jahr.

Gruss aus Zürich
Thomas

Andreas Seltenreich wrote:
> Thomas Zuberbuehler writes:
>
>> EXECUTE 'INSERT INTO geonames.metadata VALUES ( ' || geoobj || ',
>> ' || mt || ', ''' || inf || ''', ''' || s || ''', ''' || d ||''');';
>
> Hmm, sind hier geoobj und mt vertauscht?
>
>> CREATE TABLE geonames.metadata (
>>
>> fid_metatype INTEGER,
>> fid_geoobject BIGINT,
>
> Gruß
> Andreas

--
Thomas Zuberbühler
http://www.zubi.li

______________________________________________________________________
>> GPS Access for Java, http://www.gafj.net, http://gafj.tigris.org <<