Hash in Klartext?

Fragen, Probleme etc. zu den prozedularen Sprachen ( PL/Tcl, PL/Perl und PL/Python).
sly
Neuer Benutzer
Beiträge: 20
Registriert: Di 5. Okt 2010, 14:52

Beitrag von sly » Mi 3. Nov 2010, 12:30

Ok. Denke ich werde es erstmal einfach so belassen. Aber eine viel wichtigere Frage:

Scheinbar werden Änderungen, die per spi_exec_query("UPDATE... abgeschickt werden und auch mit "status: SPI_OK_UPDATE" quittiert werden nicht sofort ausgeführt. Kann das sein? In meinem Fall müssen die Änderungen unbedingt sofort ausgeführt werden.

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads » Mi 3. Nov 2010, 12:39

Was genau meinst du mit "werden nicht sofort ausgeführt"?
Deine Stored Procedure läuft innerhalb einer Transaktion. Erst wenn diese beendet ist, werden sämtliche Änderungen committed und damit für andere sichtbar.
Deine eigene Transaktion sieht die Änderungen jedoch sofort.

Zu dem Thema solltest du dich mal zur Isolation von Transaktionen belesen.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

sly
Neuer Benutzer
Beiträge: 20
Registriert: Di 5. Okt 2010, 14:52

Beitrag von sly » Mi 3. Nov 2010, 13:53

Also folgendes Szenario. Eine Tabelle mit Postgis Polygonen existiert. In einer plperl Funktion frage ich ab, ob sich 2 postgis Polygone überschneiden. Ist das der Fall, dann speichere ich den Überschneidungsbereich als neues Polygon in die Tabelle und beschneide die zwei anderen um den Überschneidungs-Bereich.

Wenn ich nun innerhalb der Funktion, nachdem diese drei Operationen stattgefunden haben, abfrage, wie viele Polygone in der Tabelle sind, dann erhalte ich einen erhöhten Wert im Vergleich zum Ausgangszustand. Allerdings liefert die Abfrage nach den Abmaßen der Polygone die Ausgangs-Abmessungen und nicht die veränderten! Folglich scheitern weitere Beschneidungen daran, dass nicht die korrekten (durch vorherige Schnitte entstandenen) Abmessungen abgefragt werden können. Innerhalb der Funktion läuft eine Schleife, die jedes Polygon mit jedem verschneiden soll.

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads » Mi 3. Nov 2010, 15:44

Liest du die Werte erneut ein oder wie fragst du die neuen Abmessungen ab?
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

sly
Neuer Benutzer
Beiträge: 20
Registriert: Di 5. Okt 2010, 14:52

Beitrag von sly » Mi 3. Nov 2010, 16:53

Lag wohl an meiner Programmstruktur. Habe mich etwas zu "Isolation von Transaktionen" schlau gemacht und einzelne Funktionen für einzelne Aufgaben geschrieben. Jetzt werden auch die korrekten Abmessungen geholt. Der nächste Knackpunkt ist auch schon da. Der ist allerdings Kopfarbeit und nicht "Technik".

Vielen, vielen Dank ads.

sly
Neuer Benutzer
Beiträge: 20
Registriert: Di 5. Okt 2010, 14:52

Beitrag von sly » Di 16. Nov 2010, 11:31

Eine Nachfrage zum Thema "Änderungen übernehmen". Wieso die Änderungen nicht "sofort übernommen" werden ist mir jetzt klar. In den postgresql doc
PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: COMMIT
hört es sich für mich so an, als wenn man auch manuell ein COMMIT senden könnte. Ich würde das gerne aus plperl heraus tun, und meine gelesen zu haben, dass es sowohl aus plperl, wie auch plpython heraus gehen müsste. Allein, wie ist die Syntax für den COMMIT-Befehl? Etwa so:
spi_exec_query("SELECT COMMIT;");

Und worauf sollte man achten bezüglich Zeitpunkt der Ausführung?

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads » Di 16. Nov 2010, 11:57

Deine Stored Procedure wird bereits in einer Transaktion ausgeführt. Du kannst die nicht committen.

Oh, und die richtige Syntax wäre - wie in der Dokumentation beschrieben - einfach "COMMIT". Ohne "SELECT" davor.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

Antworten