/ / Die Zeilenzahl kann der Variablen in plpgsql - postgresql, postgresql-9.1, plpgsql nicht zugewiesen werden

In plpgsql kann keine Zeilenzahl zugewiesen werden

Ich versuche, einer Variablen in plpgsql 9.1 die Zeilennummer als Ganzzahl zuzuweisen.
Versuch 1: Es wird nichts zugewiesen

maz int := (SELECT count(col1) FROM table WHERE col1 = quote_literal(val1));

Versuch 2: Fehler in der Nähe von INTO erhalten

EXECUTE "SELECT count(col1) FROM table
WHERE col1 = quote_literal(val1) INTO maz";

BEARBEITEN: "in" gelöscht, da es ein Tippfehler war.

Antworten:

3 für die Antwort № 1

Ihre Beispiele sind etwas chaotisch.

Das erste Beispiel ist falsch - wahrscheinlich falsche Verwendung von IN Schlüsselwort und quote_literal() ist in diesem Zusammenhang absolut nutzlos. Der zweite ist wahrscheinlich auch falsch - wenn val1 ist eine Variable. plpgsql-Variablen sind in der SQL-Zeichenfolge in einem nicht sichtbar EXECUTE Aussage. Nächste Ausgabe ist INTO in der SQL-Zeichenfolge.

postgres=# do $$
DECLARE rc int;
val1 varchar := "Hello";
BEGIN
rc := (SELECT count(*) FROM xxx WHERE xxx.v = val1);
RAISE NOTICE "%", rc;
EXECUTE "SELECT count(*) FROM xxx WHERE xxx.v = $1"
USING val1 INTO rc;
RAISE NOTICE "%", rc;
END;
$$;
NOTICE:  1
NOTICE:  1
DO

quote_literal() ist normalerweise für dynamisches SQL erforderlich, wenn Sie a nicht verwenden können USING Klausel. In deinem Beispiel:

EXECUTE "SELECT count(*) FROM xxx WHERE xxx.v = " || quote_literal(val1)
INTO ...

Es schützt vor SQL-Injection und sorgt für eine ordnungsgemäße Flucht.

Moderne Releases haben die format() Funktion:

EXECUTE format("SELECT count(*) FROM xxx WHERE xxx.v = %L", val1) INTO ...

Aber EXECUTE ... USING sollte bevorzugt werden.