Oracle: Long - varchar konverzió I.
Adatbázisokkal kapcsolatos cikkek / Oracle (1646 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 |