» »

[PL SQL] Mešanje podatkov

[PL SQL] Mešanje podatkov

JanezH ::

Imam tabelo z atributi Person_ID, First_Name, Maiden_Name, Last_Name (150.000 zapisov)
Rad bi zmesal podatke: First_Name, Maiden_Name, Last_Name tako da najprej zmesamo First_Name, nato Maiden_Name in na koncu Last_Name
Se pravi nekako takole:

Zacetna tabela:
ID First_Name Maiden_name Last_Name
1. Miran Grozni Mlakar
2. Peter Kosmati Pogačar
3. Jacman Uhati Raka

Dobimo tabelo:
ID First_Name Maiden_name Last_Name
1. Jacman Grozni Pogacar
2. Miran Uhati Raka
3. Peter Kosmati Mlakar


Delam pa na tak način:

1. Najprej z enim kurzorjem naredim selekcijo katere zapise bom mešal:

CURSOR zenske is
SELECT p.Person_Id
FROM person p, party pa
WHERE p.Person_ID = pa.Party_ID
AND pa.Party_Type_ID = 1
ORDER by p.Person_Id desc;

2. Nato odprem se en kurzor v katerem so atributi, ki jih bom mesal - v temle primeru First_Name:

OPEN z_ime FOR
SELECT p.First_Name
FROM person p, party pa
WHERE p.Person_ID = pa.Party_ID
AND pa.Party_Type_ID = 1
ORDER BY p.First_Name ASC;

sCounter := 0;

3. Sprehajam se cez prvi kurzor in iz drugega kurzorja jemljem First_Name ter ga update-am v tabelo, pri tem naredi COMMIT na vsakih 1000 zapisov:

FOR r IN zenske LOOP
FETCH z_ime
INTO sFirst_Name;

sCounter := sCounter + 1;

UPDATE person p
SET p.First_Name = sFirst_Name
WHERE p.Person_ID = r.Person_ID;

IF ( mod(sCounter, 1000)= 0 ) THEN
COMMIT;
--Dbms_Output.put_line (sCounter || ', ');
END IF;

END LOOP;

4. Na enak način naredim še za Maiden_Name in Last_Name


Ampak to dela zelo zelo počasi. Mi lahko kdo napiše proceduro, ki bi to hitreje opravila?

WarpedGone ::

1. narediš novo tabelo person_new(Person_ID, First_Name, Maiden_Name, Last_Name), nanjo daš le PK
2. nato narediš vanjo INSERT ... SELECT ...

INSERT INTO person_new
SELECT s1.person_id,
s2.First_Name,
s3.Maiden_Name,
s4.Last_Name
FROM (SELECT ROWNUM AS ID,
person_id
FROM person
ORDER BY person_id ASC ) s1,
(SELECT ROWNUM AS ID,
First_Name
FROM person
ORDER BY First_Name DESC) s2,
(SELECT ROWNUM AS ID,
Maiden_Name
FROM person
ORDER BY Maiden_Name ASC ) s3,
(SELECT ROWNUM AS ID,
Last_Name
FROM person
ORDER BY Last_Name DESC) s4
WHERE s1.ID = s2.ID AND
s2.ID = s3.ID AND
s3.ID = s4.ID;

3. tabelo person zamenjaš z novo:
RENAME person TO person_org;
RENAME person_new TO person;
4. zgradiš morebitne dodatne indekse

Tole seveda nuca velik ROLLBACK, je pa za probat.
Zbogom in hvala za vse ribe


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

php update

Oddelek: Programiranje
7931 (745) keworkian
»

php skripta za registracijo uporabnikov

Oddelek: Izdelava spletišč
162091 (1672) skorpio
»

razložitev nekaterij elementov v visual studio 05

Oddelek: Programiranje
72107 (1912) darkolord
»

[SQL] Ali se tale poizvedba da optimizirat?

Oddelek: Programiranje
81083 (971) krho
»

Obleci nas!

Oddelek: Novice / Grafične kartice
132420 (2420) root987

Več podobnih tem