Variablen in SQL-Skripten

Ich arbeite seit Anfang des Jahres mit Postgres (vorher meist Sybase und Microsoft SQL Server) und verwende hauptsächlich Java zur Programmierung. Aber ab und zu muss man doch mal ein SQL-Skript bemühen.

Ich suche nach einer Möglichkeit, in einem Abfrage-Skript mit Variablen zu arbeiten. Ich kenne also von SQL Server so etwas wie:

declare @max int

select @max = max(aufnr) from auftrag

select * from auftragpos where aufnr = @max
select * from rechnung where aufnr = @max
select * from rechpos where aufnr = @max

go

Wie kann man in Postgres etwas ähnlich hinkriegen? Ich will nicht gleich eine Funktion schreiben, sondern eher schnell mal eine Quick-and-dirty-Lösung eintippen (und anschließend wieder vergessen) können. Ich habe schon eine Weile die Dokumentation durchgeblättert und Google bemüht, aber noch keine Ansatz entdeckt, der nicht sofort zu Syntax-Fehlern führt.

So in der Art IMHO nicht, zumindest wüßte ich nicht, wie man das Resultat einer Abfrage in eine Variable bekommt.

Was aber geht ist folgendes:

test=# select * from b;
 id | n
----+---
  1 | 2
  2 | 3
(2 rows)

test=*# \set myid 1;
test=*# select * from b where id=:myid;
 id | n
----+---
  1 | 2
(1 row)

hilft das?


Andreas

Danke für die schnelle Antwort. Es hilft aber leider nur zum Teil. Ich würde eben auch gern Abfrage-Ergebnisse in Variablen speichern und weiterverarbeiten. Außerdem ist “\set” ja wohl ein interner Befehl von psql, kein Teil des Postgres-SQL-Dialekts. Wenn ich dasselbe zum Beispiel im SQL-Editor von NetBeans probiere, geht es nicht.

Mit Functions werde ich vermutlich auch nicht auf Anhieb glücklich werden, denn da kann wohl nicht einfach ein SELECT einbauen, nur um sich ein paar Tabellenzeilen anzeigen zu lassen.

Nun ja, soweit ich weiß kennt SQL an und für sich auch nicht solche Dinge wie Variablen. Dafür aber Tabellen. Mir ist schon klar, was Du da willst, aber so, wie das \set ein Ding von psql ist sind die Lösungen anderer Systeme halt auch nur deren Insel-Lösungen.

Was allerdings noch geht sind custom_variable_classes, zu setzen in der postgresql.conf. Damit gehen Dinge wie:

test=*# set myvar.foo = 1;
SET
test=*# select * from b where id = (current_setting('myvar.foo'));
 id | n
----+---
  1 | 2
(1 row)

Ich habe dazu in der postgresql.conf stehen:

#---------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#---------------------------------------------------------------------------

#custom_variable_classes = ''           # list of custom variable class names
custom_variable_classes = 'myvar'

Dies dürfte dann auch außerhalb von psql, also global mit PostgreSQL, funktionieren.


Andreas

Danke. Das werde ich mal ausprobieren.