Re: Funktionsargument für eine "field IN ($1)" Bedingung

From: Andreas Tille <andreas(at)an3as(dot)eu>
To: PostgreSQL <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: Funktionsargument für eine "field IN ($1)" Bedingung
Date: 2010-12-16 12:21:55
Message-ID: 20101216122155.GA31810@an3as.eu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

On Thu, Dec 16, 2010 at 12:17:00PM +0100, Nicolas Barbier wrote:
> > ZEILE 1: SELECT * FROM mytable WHERE field IN ( || $1 || ) ;
> >                                                   ^
> > ANFRAGE:  SELECT * FROM mytable WHERE field IN ( || $1 || ) ;
> > KONTEXT:  PL/pgSQL function "test_set_of_arguments" line 7 at FOR-über-EXECUTE-Anweisung
>
> Das »$1« soll von PL/PgSQL interpretiert werden (also nicht Teil des
> SQL Statements werden), es soll also nicht im String eingebettet
> werden:
>
> query = 'SELECT * FROM mytable WHERE field IN (' || $1 || ') ;';
>
> (Achte auf die zusätzlichen Anführungszeichen.)

Ja sicher. Grr, manchmal sieht man's einfach nicht. Danke.

> Das Ganze is natürlich ein bisschen gefährlich bezüglich SQL-Injection
> (falls der String vom Benutzer beeinflusst werden kann), und aufgrund
> des EXECUTE Statements auch nicht sonderlich performant (das SQL
> Statement muss jedes mal erneut gebildet, geparset und geplant
> werden).

SQL-Injection ist in dem Fall nicht relevant, da die Funktion nur von
einem eigenen Script aufgerufen wird und dort festgelegt wird, was in
der Liste steht.

Hinsichtlich Performance: Welche Alternativen hätte ich in einem solchen
Fall? Konkret geht es mir darum, bestimmte Paketeigenschaften aus der
Ultimate Debian Database[1] abzufragen. Die Eigenschaften werden immer
gleichzeitig für einen Satz von Paketnamen benötigt. Ein solcher Satz
kann in der Größenordnung von 10 bis 100 Paketnamen haben. Die Tabelle
die abgefragt wird hat die Struktur:

package text,
eigenschaft1 text,
eigenschaft2 text,
...
eigenschaftn text,
version debversion,
architecture text

Ich möchte die eigenschaften 1-n zu allen Paketen der Liste ('package1',
'package2', ..., 'packagen') abfragen aber im Ergebnis brauche ich nur
die höchste version (debversion ist ein sortierbarer Datentyp, für den
MAX() definiert ist) und eine beliebige architecture (in der diese
höchste version existiert). Für jeden Hinweis, wie das auch noch
*performant* geht, bin ich natürlich sehr dankbar, denn die sinnvolle
Aggregierung der in meiner Ausgangsfrage erhaltenen Tabelle liegt mir
noch etwas schwer im Magen.

Viele Grüße

Andreas.

[1] http://wiki.debian.org/UltimateDebianDatabase

--
http://fam-tille.de

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Nicolas Barbier 2010-12-16 13:05:54 Re: [pgsql-de-allgemein] Funktionsargument für eine "field IN ($1)" Bedingung
Previous Message Nicolas Barbier 2010-12-16 11:17:00 Re: [pgsql-de-allgemein] Funktionsargument für eine "field IN ($1)" Bedingung