Skip site navigation (1) Skip section navigation (2)

Re: Frage zu stored procedures

From: Peter Wullinger <some-mail-drop(at)gmx(dot)net>
To: Marcel Boscher <mboscher(at)emedia-office(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Frage zu stored procedures
Date: 2004-08-09 10:50:51
Message-ID: 20040809105051.GA1636@peter.home.wul (view raw or flat)
Thread:
Lists: pgsql-de-allgemein
In epistula a Marcel Boscher, die horaque Mon, Aug 09, 2004 at 11:23:00AM +0200:
> Hallo Leute,
>

Tag, Marcel,

> 
> [snip]
> 
> Erstellen eines 4 stelligen alpha-numerischen Codes
> zufällig generiert mit einer Abfrage auf die DB ob dieser
> Code bereits existiert .... wenn ja dann neuen Code
> generierern. Bei nein Rückgabe an mein PHP Proggy
> 
> 1. ist sowas möglich?

Ja, aber problematisch:

Gehen wir mal davon aus, dein Zufallsgenerator (rand()/random()) wäre 
mathematisch von geringer Qualität und würde eine Zahlensequenz liefern,
die eine sehr kurze Periode aufweist.

Als Beispiel nehme ich jetzt einfach mal der Periode vier, dann bekommst
du vielleicht folgende Codes:

- 3dad
- d345
- 3ds4
- 834f

Danach hängt sich dein Algorithmus in einer Endlosschleife auf.

Vier Stellen sind imho zu wenig, die Kollisionswahrscheinlichkeit ist da
recht hoch. Fall ich wirklich eine eindeutige ID brauche, gibt
Uhrzeit + Datum + Zufallszahl und das Ganze durch MD5 recht brauchbare
Werte.

> und
> 2. kann mir jemand einen Ansatz oder nen Lösungsweg aufzeigen

Für Zahlen von 0 bis 10000 in PL/pgSQL:

DROP TABLE number_history;
CREATE TABLE number_history (
    entry INTEGER PRIMARY KEY
);

DROP FUNCTION generate_number();
CREATE FUNCTION generate_number() RETURNS INTEGER AS '
DECLARE
    nentries    INTEGER;
    key         INTEGER;
BEGIN
    nentries := 1;
    WHILE (nentries > 0) LOOP
        key := trunc(random() * 10000);
        SELECT
			INTO nentries
			count(*)
            FROM number_history
            WHERE number_history.entry = key;
    END LOOP;

    INSERT
		INTO number_history (entry) 
		VALUES (key);

    RETURN(key);
END;
' LANGUAGE 'plpgsql';

Und dann zum Erzeugen der Zufallszahl:

SELECT generate_number();

Geht natürlich ähnlich auch in PL/C, PL/Perl und PL/Python.

Mit ein paar Tricks kann man auch den Tabellennamen als Parameter
übergeben.

Gruß,
	Peter

-- 
BSD is what you get when a bunch of Unix hackers sit down to try to port
a Unix system to the PC.
Linux is what you get when a bunch of PC hackers sit down and try to write
a Unix system for the PC.

In response to

pgsql-de-allgemein by date

Next:From: Tobias WeideltDate: 2004-08-13 22:51:07
Subject: Re: Frage zu stored procedures
Previous:From: Marcel BoscherDate: 2004-08-09 09:23:00
Subject: Frage zu stored procedures

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group