AUSFÜHREN...IN...USING-Anweisung in PL/pgSQL nicht erfüllen können, in einen Satz?
Ich bin versucht zu schreiben, ein Bereich, der eine Funktion in PL/pgSQL, dass die Schleifen durch eine hstore
an und setzt den Datensatz-Spalte(die Schlüssel des hstore
) einen bestimmten Wert (der Wert, der hstore
). Ich bin mit Postgres 9.1.
Den hstore
Aussehen wird: ' "column1"=>"value1","column2"=>"value2" '
Allgemein, hier ist was ich will aus einer Funktion, der in einem hstore
und hat einen Datensatz mit Werten zu ändern:
FOR my_key, my_value IN
SELECT key,
value
FROM EACH( in_hstore )
LOOP
EXECUTE 'SELECT $1'
INTO my_row.my_key
USING my_value;
END LOOP;
Die Fehler, die ich bekomme mit diesem code:
"myrow" has no field "my_key"
. Ich habe Suche für eine ganze Weile nun nach einer Lösung, aber alles andere habe ich versucht, das gleiche Ergebnis zu erzielen war, hat nicht funktioniert.
InformationsquelleAutor Nuggles | 2013-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfachere alternative zu deiner Antwort gepostet. Sollte deutlich besser.
Diese Funktion ruft eine Zeile aus einer bestimmten Tabelle (
in_table_name
) und primary key-Wert (in_row_pk
), und fügt Sie als neue Zeile in der gleichen Tabelle, mit einige Werte ersetzt (in_override_values
). Die neue primary key-Wert, der standardmäßig zurückgegeben wird (pk_new
).Nennen:
SQL Fiddle.
Verwenden
regclass
als input-parameter geben, so dass nur gültige Tabellennamen verwendet werden können, um mit zu beginnen und SQL-Injektion ist ausgeschlossen. Die Funktion auch nicht früher und anmutig sollten Sie eine illegale Tabelle Namen.Verwenden Sie ein
OUT
parameter (pk_new
) zur Vereinfachung der syntax.Keine Notwendigkeit, um herauszufinden, den nächsten Wert für den Primärschlüssel manuell. Es wird automatisch eingefügt und kehrte nach der Tat. Das ist nicht nur einfacher und schneller, Sie vermeiden auch, verschwendet wird oder out-of-order-Sequenz-Nummern.
Verwenden
format()
zur Vereinfachung der Montage der dynamische query-string und macht es weniger fehleranfällig. Beachten Sie, wie ich verwenden positionsgebundenen Parameter für Bezeichner und strings bzw.Baue ich auf Ihre impliziten Annahme erlaubt, dass die Tische haben eine eine einzige primary key-Spalte des Typs integer mit einer Spalte Standard. In der Regel
serial
Spalten.Zentrales element der Funktion ist die Letzte
INSERT
:#=
- operator in einer untergeordneten select-und zerlegen Sie die resultierende Zeile.SELECT
.RETURNING
- Klausel.OUT
parameter direkt.Es durchaus ein paar erweiterte Funktionen in diesem PL/pgSQL-Funktion. 🙂
InformationsquelleAutor Erwin Brandstetter
Da wollte ich nicht zu haben, um mit allen externen Funktionen aus Gründen der Geschwindigkeit, habe ich mir eine Lösung mit hstores zum einfügen eines Datensatzes in eine Tabelle:
Es ist schon ein bisschen mehr als das, was ich mir vorgestellt hatte, aber es funktioniert und ist tatsächlich ziemlich schnell.
Ich habe die header-und ein bisschen mehr detail, wo nötig.
Ich glaube, dass ich endlich verstehen, was Sie hier tun, ist jetzt. Möglicherweise haben es leichter gemacht, mit einigen Allgemeinen Erklärung für die Rolle dieser Funktion. Es ist nicht genau das, was die Frage fragt nach.
InformationsquelleAutor Nuggles