Freitag, Mai 20, 2011

Virtual Columns

In einem Thread bei Tutorials.de wurde dieser Tage die Frage gestellt, wie man in Oracle 10 eine Spalte automatisch mit einem durch einen HASH-Algorithmus aus einer anderen Spalte erzeugten Wert füllen kann. Nun bin ich mir zwar nicht ganz sicher, wozu die Anforderung dient, aber zumindest scheint mir das eine sehr naheliegende Verwendung für Virtual Columns zu sein - die aber nur in 11g verfügbar sind. Hier meine Antwort aus dem Thread:

In Oracle 10 kann man die Befüllung der HASH-Spalte via Trigger durchführen - obwohl Trigger (in der Regel) häßlich, schlecht wartbar und übel für die Performance sind:

-- 10.2.0.4
create table test
( string_value varchar2(32)
, hash_value number);
 
create or replace trigger hash_trigger
before insert
on test
for each row
begin
  select ora_hash(:new.string_value)
  into :new.hash_value
  from dual;
end hash_trigger;
/
 
insert into test(string_value) values ('HELLO WORLD');
 
select * from test;
 
STRING_VALUE                     HASH_VALUE
-------------------------------- ----------
HELLO WORLD                      3784902367

Viel hübscher geht das in 11g, wo man zu diesem Zweck virtual columns verwenden kann:

-- 11.1.0.7
create table test
( string_value varchar2(32)
, hash_value NUMBER GENERATED ALWAYS AS (ora_hash(string_value)) virtual);
 
insert into test(string_value) values ('HELLO WORLD');
 
select * from test;
 
STRING_VALUE                     HASH_VALUE
-------------------------------- ----------
HELLO WORLD                      3784902367

Eine schlüssige Zusammenfassung zum Thema virtual columns liefert z.B. Tim Hall.

Keine Kommentare:

Kommentar veröffentlichen