Hallo 
Bin relativ neu hier. Mein Vorhaben ist es, mittels einer for-Schleife 100/1000 oder 10.000 mal eine Schleife durchlaufen zu lassen,
mittels derer eine Zufallszahl und eine abhängige Variable erstellt wird, die anschließend in die DB geschrieben wird. Bei 100 Durchläufen, sollten also 100 neue Zeilen erscheinen.
Ich habe bereits einen Vorschlag, allerdings kommen bei mir ständig Fehlermeldungen. Vielleicht kann sich das ja einer mal anschauen und sieht sofort den Fehler
Danke (Y)
CREATE OR REPLACE FUNCTION random_test()
RETURNS text AS
$$
DECLARE
steam FLOAT;
temperature FLOAT;
BEGIN
steam := 0;
temperature:=0;
FOR i IN 1..100 LOOP
steam:=ROUND( CAST(((35- 5 -1) * random() + 5) AS integer), 1);
temperature := 1,19403*steam-4,029851;
INSERT INTO example_data (temperature, steam) VALUES (temperature, steam);
END LOOP;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER
COST 10;
Select random_test();
Fehlermeldung:
FEHLER: Anfrage „SELECT 1,19403*steam-4,029851“ hat 3 Spalten zurückgegeben
KONTEXT: PL/pgSQL-Funktion random_test() Zeile 15 bei Zuweisung
********** Fehler **********
FEHLER: Anfrage „SELECT 1,19403*steam-4,029851“ hat 3 Spalten zurückgegeben
SQL Status:42601
Kontext:PL/pgSQL-Funktion random_test() Zeile 15 bei Zuweisung
ODER ALTERNATIV
irg. was mit volatile Funktion INSERT
Du willst vermutlich 1.194 oder so angeben, machst aber ein Komma statt Dezimalpunkt.
temperature := 1,19403*steam-4,029851;
Davon abgesehen: du brauchst dafür keine Schleife, Du kannst generate_series() nutzen short-demo:
test=# select random() from generate_series(1,10) s;
random
--------------------
0.643571621738374
0.841236262116581
0.444171133451164
0.0290831727907062
0.992737092077732
0.0322947343811393
0.63617328600958
0.134205300826579
0.517273956444114
0.715365590993315
(10 rows)
Das kannst Du soweit ausbauen, daß Du Deine testdaten damit erzeugst.
Erstmal Danke für deine Antwort. Ich möchte die Random Zahlen allerdings in eine vorhande Tabelle speichern!
Geht das so? Oder generiert er so nicht einfach nur 10 Zahlen die mir nichts bringen?
Kann ich Insert Into xy (column x, column y) Values (Select test=# select random() from generate_series(1,10) s) machen?
Edit: Wenn ich deinen Vorschlag einbaue, kommt folgende Fehlermeldung
CREATE OR REPLACE FUNCTION random_test5()
RETURNS text AS
$$
DECLARE
steam FLOAT;
temperature FLOAT;
BEGIN
temperature=#Select random() from generate_series(1,10) s;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER
COST 10;
Select random_test5();
Fehlermeldung:
FEHLER: Syntaxfehler bei „=#“
ZEILE 12: temperature=#Select random() from generate_series(1,10) …
^
********** Fehler **********
FEHLER: Syntaxfehler bei „=#“
SQL Status:42601
Zeichen:147
Ist also =# Falsch? Habe auch schon := und nur = ausprobiert, hilft aber nicht
Edit2:
CREATE OR REPLACE FUNCTION random_test5()
RETURNS text AS
$$
DECLARE
steam FLOAT;
temperature FLOAT;
BEGIN
INSERT INTO example_data (temperature) Select random() from generate_series(1,10) s;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER
COST 10;
Select random_test5();
Bringt
FEHLER: INSERT ist in als nicht „volatile“ markierten Funktionen nicht erlaubt
KONTEXT: SQL-Anweisung „INSERT INTO example_data (temperature) Select random() from generate_series(1,10) s“
PL/pgSQL-Funktion random_test5() Zeile 9 bei SQL-Anweisung
********** Fehler **********
FEHLER: INSERT ist in als nicht „volatile“ markierten Funktionen nicht erlaubt
SQL Status:0A000
Kontext:SQL-Anweisung „INSERT INTO example_data (temperature) Select random() from generate_series(1,10) s“
PL/pgSQL-Funktion random_test5() Zeile 9 bei SQL-Anweisung
hervor 
Zu Deinen Fragen:
- ja, Du kannst das Resultat eines selects als Quelle für einInsert nehmen
test=# create table ziel (i int);
CREATE TABLE
Time: 215,870 ms
test=*# insert into ziel select * from generate_Series(1,10) s;
INSERT 0 10
Time: 26,922 ms
test=*# select * from ziel;
i
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
Time: 0,822 ms
test=*#
- ich arbeite mit der psql-Konsole, das ist interaktiv. Die DB zeigt mir z.B. einen Prompt. Dieser ist nicht Bestandteil meiner Abfrage und gehört damit auch nicht in Deine Funktion.
- immutablel und volatible sind Eigenschaften. Eine Funktion, die Daten ändert, kann nicht immutable sein. Lies bitte die Doku, das ist alles massiv erklärt.
Sorry, hab grad nicht viel Zeit. Bitte: lies die Doku.