Re: self defined counter function - Mailing list pgsql-admin

From Harald Fuchs
Subject Re: self defined counter function
Date
Msg-id pu8ygqbuc8.fsf@srv.protecting.net
Whole thread Raw
In response to self defined counter function  (Enrico Ortmann <pg.admin@radax.net>)
List pgsql-admin
In article <1574570229.20040420095643@radax.net>,
Enrico Ortmann <pg.admin@radax.net> writes:

> Hi admins,
> I got a conceptual question on creating a stored procedure
> I need for my app. First the description of the problem:

> I need a counter which works with 36 possible values per
> character [0-9 and thereafter A-Z].
> That means if incremented it should return values as follows:
>     0000
>     0001
>     0002
>     ...
>     0009
>     000A
>     000B
>     000C
>     ...
>     000X
>     000Y
>     000Z
>     0010
>     0011
>     0012
>     ...

> and so on.

> My question is if anybody has already implemented such a
> user-defined 'sequence' in PL/PGSql or if anyone has a great
> idea on how to do that. The only solution I see at present is
> to do that in PHP which is used to code the mentioned userland.

> I suggest to solute on doing the following.

>  - I create a sequence on the DBS
>  - I get the next value of this sequence
>  - I convert the next value in PHP in the code I need

> The problem I see on doing this is that I always need to
> convert if I want to get any kind of information about the
> counter. For example it could be that I only want to know
> what the last given value was. Because of the high traffic
> value on the application I have to take care of, that the
> information I read is quite correct at any time. So if I
> have to convert the value of the sequence therefore I need
> a little time. In the meantime the value could have changed
> and my information is worthless.

> I think the best way would be to code a store procedure
> for the problem. Any ideas would be welcome.

You could use an ordinary sequence internally and translate the
sequential values to your representation on output, like that:

  SELECT num / 36 ||
         CASE
         WHEN num % 36 < 10 THEN chr ((num % 36) + ascii ('0'))
         ELSE chr ((num % 36) - 10 + ascii ('A'))
         END

Me thinks this might be the most efficient way to deal with that.

pgsql-admin by date:

Previous
From: Raquel Vieira
Date:
Subject: unsubscribe
Next
From: "Arthur Ward"
Date:
Subject: Unfamiliar recovery message afer server crash