Oracle: Long - varchar konverzió I.

Adatbázisokkal kapcsolatos cikkek / Oracle (757 katt)

Előfordulhat, hogy egy Oracle-ben létrehozott tábla long típusú oszlopának értékeit szeretnénk átmásolni egy olyan táblába, amelyben a céloszlop típusa nem long, hanem varchar2. Sajnos ebben az esetben - tapasztalataim szerint - a konverzió nem végezhető el egykönnyen, csak SQL-utasítások használatával.

A probléma bemutatása céljából hozzunk létre két táblát:

-- Forrásadatok

create table long_proba_src
(sor_id integer,
szoveg long,

primary key (sor_id));

-- Céltábla

create table long_proba_dst
(sor_id integer,
szoveg varchar2(50),

primary key (sor_id));



Látható, hogy a céltábla szoveg oszlopa mindössze 50 karakter. Ilyenkor természetesen csak a forrásadatok lerövidítésével lehet elvégezni a másolást.

Ezután a forrásadatok tábláját töltsük fel véletlenszerű adatokkal egy PL/SQL script segítségével:

declare

i integer;

begin
delete from long_proba_src;

for i in 1..100 loop

insert into long_proba_src
(sor_id,
szoveg)

values

(i,
dbms_random.string('a', trunc(dbms_random.value(1,1000))));

end loop;

commit;
end;



Ha ekkor megpróbálunk egy hasonló SQL-utasítást kiadni:

select sor_id,
substr(szoveg,1,10)
from long_proba_src;



akkor az ORA-00932: ellentmondásos adattípusok: NUMBER helyett LONG szerepel hibaüzenetet kapjuk.

Ha viszont az alábbi PL/SQL scripttel másoljuk az adatokat, akkor nem kapunk hibát:

declare

cursor c_long_proba_src is

select sor_id,
szoveg
from long_proba_src
order by sor_id;

i integer;

begin
delete from long_proba_dst;

for r_long_proba_src in c_long_proba_src loop

insert into long_proba_dst
(sor_id,
szoveg)

values

(r_long_proba_src.sor_id,
substr(r_long_proba_src.szoveg, 1, 50));

end loop;

commit;
end;

Előző oldal Kapitány