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 )