2017-01-14 3 views
1

Ich habe eine Prozedur, die als Eingabe ein Suffix des Namens einer Tabelle nimmt. Dann übergebe ich mit execute format() diesen Parameter, um die dynamische Abfrage auszuführen. Das Problem ist, dass dieser Parameter ist überall gleich - ich will es nicht mal als solche x passieren:Dynamische Abfragen mit Format() mit dem gleichen Argument viele Male

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3 
FROM table_%s', inTableSuffix, inTableSuffix, inTableSuffix, inTableSuffix, ...) 

ich ein Format ähnlich den folgenden mag:

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3 
FROM table_%s', inTableSuffix) 

Ich verstehe, dass Ich kann dieses Problem lösen, indem ich einen Alias ​​für den Tabellennamen verwende, aber gibt es noch eine Alternative?

+0

So haben Sie Ihre Antwort? –

Antwort

3

können Sie wiederholt Adresse die Positions Argumente wie folgt aus:


execute format('SELECT table_%1$s.field1 
    , table_%1$s.field2,table_%1$s.field3 
FROM table_%1$s;', inTableSuffix); 

Hinweis: in diesem speziellen Fall können Sie vermeiden, sich zu wiederholen, indem sie ein Alias:


execute format('SELECT tx.field1 
    , tx.field2, tx.field3 
FROM table_%s tx;', inTableSuffix); 
+0

Es ist auch nicht notwendig, den Tabellennamen für jede Spalte zu verwenden, wenn kein Join vorhanden ist, aber selbst wenn es einen Join gibt, können Sie einen Alias ​​für die Tabelle verwenden. Daher muss der vollständige Tabellenname nicht mehrfach angegeben werden. – llouk

+1

Das ist, was ich gerade der Antwort hinzufügte ... – wildplasser

1

@wildplasser already provided the syntax wie derselbe Parameter wiederholt in format() referenziert wird. Der Code ist jedoch immer noch gefährlich. Sie benötigen Identifikatoren aus Benutzereingaben gebaut zu entkommen:

EXECUTE format('SELECT field1, field2, field3 FROM %I', 'table_' || inTableSuffix); 

Für das gegebene Beispiel nur die Parameter einmal sowieso benötigen. Der Umfang dynamischer Abfragen, die mit EXECUTE in plpgsql ausgeführt werden, ist auf die Abfrage selbst beschränkt. Andere Variablen oder Parameter der Funktion sind nicht sichtbar innerhalb EXECUTE. Daher müssen Tabellen in einer dynamischen Abfrage mit einer einzelnen Tabelle in der FROM-Klausel nicht in der Tabelle qualifiziert werden.

Aber noch wichtiger, %I is used in format() für Kennungen zur Vermeidung von Syntaxfehlern, fehlgeleitetem Untergehäuse oder, schlimmer, SQL-Injektion! Es gibt doppelte Anführungszeichen (nur!), Sonst illegale Bezeichner, just like quote_ident() would.

Details:

+0

@wildplasser: Sie scheinen zu fehlen, dass ich das bereits tue. Keine Notwendigkeit für eine (teurere) Variable, Sie können den verketteten Ausdruck als Parameter übergeben. Nebenbei: Es ist 'quote_ident()', nicht 'quote_identifier()'. –

+0

Hoppla, das habe ich nicht gesehen. – wildplasser

Verwandte Themen