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