hex nach dezimal umwandlung

Hallo,
Ich würde gerne wissen, wie ich mit welcher Funktion aus einem Hexadezimalen Ausdruck einen dezimalen Ausdruck machen kann.
Ich schreibe gerade einen SQL-Editor für PostGres und muß die Spaltenatribute genauer die exakte Splatenlänge einlesen.

Bisher habe ich rausgefunden, das ein numeric(länge,nachkommastellen) über hexadezimale schreibweise abgespeichert wird. Mit folgendem Skript bekomme ich dann die vor- und nachkommastellen angezeigt. Leider nur als Hexadezimale Schreibweise. Diese müßte ich noch in Dezimale umwandeln, kann mir jemand weiterhelfen?

MFG
Ingo

DROP TABLE t_test;

CREATE TABLE t_test
(
  varchar19 character varying(19),
  varchar20 character varying(20),
  varchar21 character varying(21),
  num20komma0 numeric(20),
  num20komma1 numeric(20,1),
  num20komma2 numeric(20,2),
  num20komma9 numeric(20,9),
  num20komma10 numeric(20,10),
  num20komma11 numeric(20,11),
  num20komma14 numeric(20,14),
  num290komma280 numeric(290,280)
) 
WITHOUT OIDS;
ALTER TABLE t_test OWNER TO "root";
GRANT ALL ON TABLE t_test TO "root";
GRANT ALL ON TABLE t_test TO public;

SELECT a.attname, 
       a.attlen, 
       a.attnum, 
       t.typname, 
       a.atttypmod, 
       a.attnotnull, 
	   case when t.typname='numeric' then 
		(SELECT (substring (to_hex(a1.atttypmod) ,0, (char_length(a1.atttypmod)-4)))  
 			FROM pg_attribute a1, pg_class c1 WHERE 
                        c1.relname = c.relname AND 
                        a1.attnum = a.attnum AND 
                        a1.attrelid = c1.oid ) 
     	   else '-1' end AS 
       precomma,
	   case when t.typname='numeric' then 
		(SELECT substring (to_hex(a2.atttypmod-4) FROM '....$')  
 			FROM pg_attribute a2, pg_class c2 WHERE 
                        c2.relname = c.relname AND 
                        a2.attnum = a.attnum AND 
                        a2.attrelid = c2.oid ) 
 	   else '-1' end AS 
       postcomma

FROM pg_class c, pg_attribute a, pg_type t
 
WHERE c.relname = 't_test' AND 
          a.attnum > 0 AND 
          a.attrelid = c.oid AND a.atttypid = t.oid
ORDER BY attnum;

Zum Verständnis:
wenn in typname ein ‘numeric’ steht gilt:

In atttypmod steht zum Beispiel 983050.
Die wandle ich ins Hexadezimalesystem um:F000A

Die letzten 4 stellen geben den Nachkommawert an:000A
Das wird wieder ins dezimale System gewandelt: 10
Davon müssen immer 4 abgezogen werden:6
(wegen CarriageReturn/Linefeed?)

Die Vorkommastellen sind alle, ausser den letzten 4 hier wäre das:F
Das wird ins dezimale System gewandelt:15

also handelt es sich um: numeric( 15,6 )

Hilft Dir PostgreSQL → ‘ASCII-String with a hexadecimal number to int’ weiter?

Ich schreibe gerade einen SQL-Editor für PostGres und muß die Spaltenatribute genauer die exakte Splatenlänge einlesen.

Bisher habe ich rausgefunden, das ein numeric(länge,nachkommastellen) über hexadezimale schreibweise abgespeichert wird. Mit folgendem Skript bekomme ich dann die vor- und nachkommastellen angezeigt. Leider nur als Hexadezimale Schreibweise. Diese müßte ich noch in Dezimale umwandeln, kann mir jemand weiterhelfen?

starte mal psql mit der Option -E. Dann kannst Du sehen, welche Befehle ablaufen, wenn Du ‘\d foo’ machst, um die Tabellendefinition zu sehen. Das läuft auf sowas wie:

test=# create table num (n numeric(15,6));
CREATE TABLE

---
test=*# select pg_catalog.format_type(a.atttypid, a.atttypmod) FROM pg_catalog.pg_attribute a WHERE a.attrelid = '19395538' AND a.attnum > 0;
  format_type
---------------
 numeric(15,6)
(1 row)

hinaus.Vielleicht kommst Du da schneller zum Ziel.


Andreas

Dankeschön pg_catalog.format_type() hat mir weitergeholfen