Deklaration von Variablen

Fragen und Probleme zu PL/pgSQL.
deathdragon
Neuer Benutzer
Beiträge: 8
Registriert: Do 28. Mai 2015, 14:25

Deklaration von Variablen

Beitrag von deathdragon » Do 12. Jan 2017, 09:38

Hallo an alle,

ich möchte gern eine Deklaration von Variablen erreichen mit den ich dann "spielen" kann. Aus der Praxis kenne ich das auf MS-SQL Server dort kann ich Variablen deklarieren und mir diese auch wieder ausgeben lassen.
Geht das auch mit Postgresql?

Laut der Doku https://www.postgresql.org/docs/9.1/sta ... tions.html

müsste ich eigentlich nur das machen

Code: Alles auswählen

day int = 5;
year integer;
month integer; 

Aber da wird schon bei der Namensvergebung gemeckert. Also hatte ich auch testweise einen Namen gewählt der nicht vorkommen könnte. War aber der gleiche Effekt. Dann schrieb ich Declare davor. Aber das scheint Funktionen vorbehalten zu sein.

Was mach ich falsch? Kann ich mir den Inhalt der Variablen auch wieder ausgeben lassen? gibt es so was wie print auch in Postgresql?

akretschmer
Erfahrener Benutzer
Beiträge: 7639
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Deklaration von Variablen

Beitrag von akretschmer » Do 12. Jan 2017, 09:44

Variablen sind Dinge von Programmiersprachen, SQL selber hat keine. Du wirst also eine Funktion in z.B. pl/pgsql erstellen, dazu mußt du auch die passende Syntax einhalten, wie z.B. die Funktion definieren. Erst dann kannst Du innerhalb dieser Funktion mit Variablen spielen.

Ausgeben kannst Du Inhalte von Variablen z.B. via Raise.

Btw.: Du verweist auf Doku zur Version 9.1, diese ist mittlerweile nicht mehr supported.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

deathdragon
Neuer Benutzer
Beiträge: 8
Registriert: Do 28. Mai 2015, 14:25

Re: Deklaration von Variablen

Beitrag von deathdragon » Do 12. Jan 2017, 12:40

Danke! Schade das dies so nicht geht wie bei MS.

Ich nutze gleich mal hier den Thread um eine weitere Frage loszuwerden.
Wie kann ich denn Abfragen in Funktionen mit Parametern beeinflussen?
Ziel ist es eine Funktion zu haben die 2 Parameter erhält und an einer Stelle (in dem Beispiel dem Zeitstempel) mit den 2 Parametern zu manipulieren.
Ich bin mal so an die Sache herangegangen klappt aber nicht. Auch finde ich stets nur Beispiele, wo leider nicht eine Zeichenkette so manipuliert wird, wie ich das gerne hätte.

Code: Alles auswählen

CREATE OR REPLACE FUNCTION neu_para3( IN month_start int, IN year_start int)
	RETURNS SETOF"Zeiten" AS 
$BODY$

	SELECT "Wert","Timestamp_Messung","wert2","Wert3","Wert4","Zahl" FROM "Zeiten" 

	where "Timestamp_Messung" = $2 + '-' + $1 + '-03 08:59:28.966' 

$BODY$
	LANGUAGE sql VOLATILE;



[\Code]

castorp
Erfahrener Benutzer
Beiträge: 1139
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Deklaration von Variablen

Beitrag von castorp » Do 12. Jan 2017, 12:57

Zuerstmal: der Operator um Strings zu verknüpfen ist || in SQL, nicht +

Du musst Jahr/Monat so umwandeln, dass das dann auch einen korrekten Timestamp ergibt, das kann man mit to_timestamp() machen:

Code: Alles auswählen

CREATE OR REPLACE FUNCTION neu_para3( IN month_start int, IN year_start int)
	RETURNS SETOF "Zeiten" AS 
$BODY$

  SELECT "Wert","Timestamp_Messung","wert2","Wert3","Wert4","Zahl" 
  FROM "Zeiten" 
  where "Timestamp_Messung" = to_timestamp(to_char(year_start, '0000')||'-'||to_char(month_start, '00') || '-03 08:59:28.966', 'yyyy-mm-dd hh24:mi:ss.ms') 

$BODY$
	LANGUAGE sql VOLATILE;
Alternativ, etwas übersichtlicher mit make_timestamp():

Code: Alles auswählen

CREATE OR REPLACE FUNCTION neu_para3( IN month_start int, IN year_start int)
	RETURNS SETOF "Zeiten" AS 
$BODY$

  SELECT "Wert","Timestamp_Messung","wert2","Wert3","Wert4","Zahl" 
  FROM "Zeiten" 
  where "Timestamp_Messung" = select make_timestamp(year_start, month_start, 3, 8, 59, 28.966);

$BODY$
	LANGUAGE sql VOLATILE;

Ausserdem: vermeide die unsäglichen doppelten Anführungszeichen. Man muss nicht nur wesentlich mehr tippen, sondern das führt langfristig immer wieder zu unschönen Problemen.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

deathdragon
Neuer Benutzer
Beiträge: 8
Registriert: Do 28. Mai 2015, 14:25

Re: Deklaration von Variablen

Beitrag von deathdragon » Do 12. Jan 2017, 15:22

@castorp

in der nächsten Testdatenbank werde ich dies berücksichtigen.
Ich hätte da noch ein Frage. Wie kann man denn mehr Spalten zurückgeben als vorher vorhanden waren. Es soll mir also einfach noch ein weitere Spalte zurückgegeben werden obwohl diese "eigentlich" vorher nicht vorhanden waren. Es soll also einfach möglich alles zurück zu geben was der SQL auch zurückgeben würde.

Code: Alles auswählen

CREATE OR REPLACE FUNCTION neu_para3( IN month_start int, IN year_start int)
	RETURNS SETOF"Zeiten" AS 
$BODY$

	SELECT "Wert","Timestamp_Messung","wert2","Wert3","Wert4","Zahl",to_char(year_start, '0000')||'-'||to_char(month_start, '00') || '-01 23:58'  FROM "Zeiten"

	  where "Timestamp_Messung" = to_timestamp(to_char(year_start, '0000')||'-'||to_char(month_start, '00') || '-03 08:59:28.966', 'yyyy-mm-dd hh24:mi:ss.ms') 

$BODY$
	LANGUAGE sql VOLATILE;

[\Code]

castorp
Erfahrener Benutzer
Beiträge: 1139
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Deklaration von Variablen

Beitrag von castorp » Do 12. Jan 2017, 15:30

deathdragon hat geschrieben:
Do 12. Jan 2017, 15:22
Wie kann man denn mehr Spalten zurückgeben als vorher vorhanden waren.
Es soll mir also einfach noch ein weitere Spalte zurückgegeben werden obwohl diese "eigentlich" vorher nicht vorhanden waren. Es soll also einfach möglich alles zurück zu geben was der SQL auch zurückgeben würde.
Indem Du mit RETURNS TABLE (...) arbeitest

Code: Alles auswählen

CREATE OR REPLACE FUNCTION neu_para3( IN month_start int, IN year_start int)
  RETURNS table(wert integer, timestamp_message timestamp, wert2 integer, .... usw ...)
AS 
....
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

tutter
Neuer Benutzer
Beiträge: 23
Registriert: Mo 28. Nov 2016, 22:31

Re: Deklaration von Variablen

Beitrag von tutter » Mo 16. Jan 2017, 17:19

So weiter geht's mit der Deklaration von Variablen.

Ich möchte gern folgende Abfrage parametrisieren:

Code: Alles auswählen

SELECT date_part('year', t) as year, date_part('month', t) as month
FROM generate_series('2016-01-01'::timestamp, '2016-12-01'::timestamp, '1 month') as t; 
Ihr ahnt es schon es sollen die Zeitpunkte manipuliert werden.

Dazu habe ich mir eine Abfrage überlegt

Code: Alles auswählen

SELECT MIN(zeitstempel),MAX(zeitstempel) from test_db;


Wenn ich also die 2 Timestamps herausgefunden habe möchte ich diese in eine Variable übergeben.
In der Microsoft Welt kann ich dies während der Laufzeit der Funktion schön DECLARE(deklarieren) und SET (überladen) machen.
Kann mir jemand zeigen wie ich das bei Postgresql machen kann?

castorp
Erfahrener Benutzer
Beiträge: 1139
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Deklaration von Variablen

Beitrag von castorp » Mo 16. Jan 2017, 18:07

Code: Alles auswählen

with vars as (
   SELECT MIN(zeitstempel) as min_zeit, MAX(zeitstempel) as max_zeit 
   from test_table
)
SELECT date_part('year', t) as year, date_part('month', t) as month
FROM generate_series(vars.min_zeit, vars.max_zeit, '1 month') as t, vars 
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

deathdragon
Neuer Benutzer
Beiträge: 8
Registriert: Do 28. Mai 2015, 14:25

Re: Deklaration von Variablen

Beitrag von deathdragon » Di 17. Jan 2017, 09:20

Danke castorp! Jetzt ist mir die Sache mit With auch wieder geläufig. Hatte ich total verdrängt das man auch diesen Weg gehen kann.

Jedoch funktioniert das ganze nicht so recht.
Ich erhalte 2 Zeitstempel. Wenn ich diese in das Selekt eingebe funktioniert die Abfrage, aber als ganzes mit with leider nicht.

Code: Alles auswählen

 SELECT date_part('year', t) as year, date_part('month', t) as month
FROM generate_series('2016-09-16 11:11:00+02'::timestamp, '2017-01-17 07:53:00+01'::timestamp, '1 month') as t;
Kannst du mir sagen wo mein Denkfehler liegt??

castorp
Erfahrener Benutzer
Beiträge: 1139
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Deklaration von Variablen

Beitrag von castorp » Di 17. Jan 2017, 09:43

deathdragon hat geschrieben:
Di 17. Jan 2017, 09:20
aber als ganzes mit with leider nicht.
Wie sieht denn Deine Abfrage "als Ganzes" aus?
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Antworten