Il mio caso d'uso per questo era la conversione di valori hash SHA-1 esadecimali in numeri interi. Senza attenzione alla precisione numerica in tutta la funzione, questo caso d'uso rivela facilmente le carenze; ma certamente i casi d'uso con numeri "molto grandi" ancora più grandi sono facili da identificare.
dato qualche hash SHA-1, la prima delle soluzioni della risposta accettata ha prodotto i seguenti:
SELECT hex_to_int('356e90d2a2d414ba8757ec2ab91f2f19c481d4c3');
-- returns 305042208670409000000000000000000000000000000000
SELECT hex_to_int('aaa9f7193cc8efe7e98145b0f8d9ae5f1712c25b');
-- returns 974318782301086000000000000000000000000000000000
Naturalmente ogni risultato essere di destra imbottito con tanti zeri è un segno di precisione inadeguato per l'uso Astuccio.
Qui è dove ho finito per ottenere la precisione di cui avevo bisogno:
CREATE OR REPLACE FUNCTION hex_to_int(hexVal varchar) RETURNS numeric(1000) AS $$
DECLARE
intVal numeric(1000) := 0;
hexLength integer;
i integer;
hexDigit varchar;
BEGIN
hexLength := length(hexVal);
FOR i IN 1..hexLength
LOOP
hexDigit := substr(hexVal, hexLength - i + 1, 1);
intVal :=
intVal +
CASE
WHEN hexDigit BETWEEN '0' AND '9' THEN CAST(hexDigit AS numeric(1000))
WHEN upper(hexDigit) BETWEEN 'A' AND 'F' THEN CAST(ascii(upper(hexDigit)) - 55 AS numeric(1000))
END *
CAST(16 AS numeric(1000))^CAST(i - 1 AS numeric(1000));
END LOOP;
RETURN intVal;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
SELECT hex_to_int('356e90d2a2d414ba8757ec2ab91f2f19c481d4c3');
-- returns 305042208670409212880202819376501392142011323587
SELECT hex_to_int('aaa9f7193cc8efe7e98145b0f8d9ae5f1712c25b');
-- returns 974318782301085717223606317572453925850501530203
Grazie, molto utile –