Insert Random Zahlen in Postgres

Hallo :slight_smile:

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 :slight_smile: 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 :confused:

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.