WHERE CURRENT OF mit einer Sicht ist nicht implementiert

Hallo,

ich habe folgendes Problem, aber zuerst zum Aufbau.

Mein Vorgänger hat eine View auf 3 Tabellen erstellt. Um die Daten über die View bearbeiten zu können, hat er Delete-, Insert- und Update-Regeln für die View hinterlegt, die entsprechend die 3 Tabellen bearbeiten.
Ich habe das Problem, dass die Update-Regel nicht funktioniert!
In der Update- und Insert-Regeln werden über Select eigene Funktionen je Tabelle aufgerufen, die dann entscheiden, ob es ein Update oder Insert ist.
Die Definitionen sehen folgend aus:

CREATE OR REPLACE RULE koerperwerte_view_update_rule AS
    ON UPDATE TO koerperwerte_view DO INSTEAD  SELECT fett_check_insert(new.kunden_id, new.messdatum, new.fmesswert, new.mandant_id) AS fett_check_insert, gewicht_check_insert(new.kunden_id, new.messdatum, new.gmesswert, new.mandant_id) AS gewicht_check_insert, blutdruck_check_insert(new.kunden_id, new.messdatum, new.bsystolisch, new.bdiastolisch, new.mandant_id) AS blutdruck_check_insert;



CREATE OR REPLACE FUNCTION fett_check_insert(fkundenid integer, fmessdatum date, fmesswert numeric, fmandant_id integer)
  RETURNS boolean AS
$BODY$
DECLARE
   lreturn boolean;
   nSaetze integer;
BEGIN
 lreturn = true;
 if fmesswert >= 0 then
   select count(*) into nSaetze
     from koerperfett
     where mandant_id = fmandant_id and kunden_id = fkundenid and messdatum = fmessdatum;

     if nSaetze > 0 then
        update koerperfett set messwert = fmesswert
          where mandant_id = fmandant_id and kunden_id = fkundenid
          and messdatum = fmessdatum;
     else
        insert into koerperfett (koerperfett_id, mandant_id, kunden_id, messdatum, messwert)
                    values (default, fmandant_id, fkundenid, fmessdatum, fmesswert);
     end if;
 end if;
RETURN lreturn;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Ich habe nur den Code einer Funktion aufgeführt, weil die anderen genauso aussehen und nur für anderen Tabellen erstellt sind.

Beim Ausführen des Update-Befehls bekomme ich folgenden Fehler, den ich in den Logs gefunden habe:

FEHLER: WHERE CURRENT OF mit einer Sicht ist nicht implementiert
ANWEISUNG: update KOERPERWERTE_VIEW set “kunden_id” = 1,“messdatum” =‘2013-02-21’::date,“gmesswert” =79.00,“mandant_id” = 1

Wenn ich im PGAdmin folgenden Befehl aufrufe, funktioniert es einwandfrei:

SELECT fett_check_insert(1, '2013-02-21'::date, 16.20, 1) AS fett_check_insert

Ich verstehe nicht, woran es ligt und wie ich den Fehler beseitigen kann!
Bitte um Hilfe!

Das Problem hat sich erledigt. Ich habe den Fehler gefunden.

Die Lösung für die Allgemeinheit:

Bei mir lag das Problem an der Anwendung der SQL-Klassen. Hier musste noch Primarykey festgelegt werden.
Wenn der Primarykey nicht festgelegt war, hat der SQL-Objekt automatisch ein Update über den Cursor versucht, was aber bei Views nicht zugelassen ist.
Bei festlegten Primarykey hat die Klasse dann einen Befehl mit Where-Klausel mit dem entsprechenden Feld ausgeführt, womit das Problem behoben war.

Danke für das Feedback. Ich hab schon gesucht, aber erfolglos.


Andreas, ebenfalls :wink:

Hi Andreas,

ich habe auch lange im Internet gesucht und nichts vernünftiges gefunden. Dann habe ich hier gepostet, was aber auch nichts gebracht hat, außer langer Fehlersuche mit vielen Debug-Meldungen und Protokollauswertungen. :astonished:
Ich hoffe, dass die gefundene Lösung auch anderen helfen kann.