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 № 1Ihre 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.