Avatar billede rossoneris Nybegynder
26. januar 2005 - 09:45 Der er 33 kommentarer og
1 løsning

Ændring af felt i tabel

I en oracle tabel er der lavet en "tastefejl" fra en udvikler - I feltet står der "test", mens der skal stå "original".

Hvordan kommer man ind i en tabel og ser felt navne og derefter retter felt navnet

Er det en større operation ?
Avatar billede teepee Nybegynder
26. januar 2005 - 12:00 #1
Hejsa,
Jeg kan ikke huske om man kan omdøbe en kolonne, når man først har kaldt den noget, men du kan oprette en ny, og derefter droppe den gamle.
ALTER TABLE tabelnavn
ADD COLUMN original varchar2(500)

UPDATE tabelnavn
SET original = test;

ALTER TABEL tabelnavn
DROP COLUMN test;
Avatar billede teepee Nybegynder
26. januar 2005 - 12:00 #2
ALTER TABEL => ALTER TABLE selfølgelig
Avatar billede holdam Nybegynder
26. januar 2005 - 13:21 #3
Kolonner kan omdøbes med

ALTER TABLE <tabelnavn> RENAME COLUMN test TO original;

Du kan se alle dine kolonnenavne med DESC <tabelnavn> i SQL*Plus. Alternativt med

SELECT column_name FROM user_tab_columns WHERE table_name='<TABELNAVN>';

(bemærk: store bogstaver)
Avatar billede rossoneris Nybegynder
26. januar 2005 - 14:54 #4
damm .. hvor er jeg dårlig til de her oracle kommendo`er .. hvordan er det man kan se tabeller
Avatar billede holdam Nybegynder
26. januar 2005 - 15:00 #5
Hvis du gerne vil have navnene på alle dine egne tabeller, kan du f.eks. lave

SELECT table_name FROM user_tables;

Hvis du vil have navnene på alle de tabeller du har adgang til, så kan du i stedet lave

SELECT table_name FROM all_tables;
Avatar billede rossoneris Nybegynder
26. januar 2005 - 16:13 #6
Ok - når jeg går ind og laver en select table_name from all_tables så kommer der 1500 navn.

Den tabel jeg søger efter dukker også op. Så vil jeg jo gerne se hvad tabellen indeholder og har prøvet med en select * from tabelnavn .. men dette virker ikke

Hvordan gør jeg det ?
Avatar billede rossoneris Nybegynder
26. januar 2005 - 22:13 #7
hmm .. er der ikke nogen der kan klare den ....... 8-(
Avatar billede holdam Nybegynder
27. januar 2005 - 09:12 #8
Når du skriver at "dette virker ikke" - hvad betyder det mere præcist? Kommer der en fejlmelding - i givet fald hvilken - eller kommer der ikke noget data?

Hvis der ikke kommer noget data, så prøv med

SELECT COUNT(*) FROM <tabelnavn>

Hvis du får at vide at der er 0 rækker i din tabel - ja, så er tabellen tom.
Avatar billede rossoneris Nybegynder
27. januar 2005 - 14:25 #9
ok .. fandt selv ud af, at der skal stå select * from brugernavn.tabelnavn - så kommer tabellen frem.

Men nu blev det hele lidt mere teknisk end frygtet. Tabellen indeholder 4 kolonner og det er kun de 2 der er relevante for det jeg skal have rettet

Den hedder "parent" - og næste "type"
            1003            Udbedring

I kolonen "parent" skal alle med "1003" rettes fra "udbedring" til "problem" - der 16 rækker ned, som altså skal rettes fra "udbedring" til "problem"

Problemet er at der andre steder i tabellen findes andre "parent" numre, som også har "udbedring" som felt - hvor det dog er rigtig nok.


Det andet og sidste der skal rettes er tilgengæld lidt lettere .. formoder jeg. I kolonnen "type" er der nogle steder skrevet "årdag" istedet for "årsag" - denne fejl er skrevet 50 gange i denne kolonne og skal bare rettes til "årsag"

Er det muligt ?
Avatar billede rossoneris Nybegynder
27. januar 2005 - 14:28 #10
Her er lige en direkte copy/paste fra det jeg mener

AILURELIST FAILUREC    PARENT TYPE
----------- -------- ---------- ----------
ROWSTAMP
----------------------------------------
      1003 ALLE
23139

      1004 BLOK          1003 UDBEDRING
78100

      1005 DEFO          1003 UDBEDRING
78101
Avatar billede holdam Nybegynder
27. januar 2005 - 16:22 #11
Du kan slippe for at skrive brugernavn.tabelnavn hvis du logger ind til databasen som den bruger der ejer tabellerne.

Dine opdateringer kan skrives:

UPDATE <tabelnavn> SET type='Problem' WHERE parent=1003;
UPDATE <tabelnavn> SET type='Årsag' WHERE type='Årdag';

Husk at lave en SELECT mod tabellen inden du COMMITter for nu lige at checke at det er gået godt (selv om man kan fortryde med flashback).
Avatar billede rossoneris Nybegynder
28. januar 2005 - 08:31 #12
UPDATE <tabelnavn> SET type='Problem' WHERE parent=1003;

Ovenstående har jeg kørt og den ændrede 16 rækker - hvilket godt kan passe. Kigger jeg i tabellen igen, står det dog stadig forkert - skal man først lave en commit eller ?

UPDATE <tabelnavn> SET type='Årsag' WHERE type='Årdag';

Den kan ikke finde nogen rækker - "årsag" skal som nævnt erstatte "årdag" - men så vidt jeg kan se bør det være rigtig nok eller ?
Avatar billede rossoneris Nybegynder
28. januar 2005 - 08:38 #13
FAILURELIST FAILUREC    PARENT TYPE
----------- -------- ---------- ----------
ROWSTAMP
----------------------------------------
      1036 FOAN          1006 ÅRDAG
23336

      1037 FOVE          1006 ÅRDAG
23337

Lige et eksempel
Avatar billede holdam Nybegynder
28. januar 2005 - 08:54 #14
Der skal stå 'ÅRDAG' i din WHERE-clause (når det nu er sådan det er skrevet).

Hvis du skal se data fra en anden session, skal du commit'te først. Hvis du skal se det fra din egen session, er det ikke nødvendigt.
Avatar billede rossoneris Nybegynder
28. januar 2005 - 10:41 #15
Det vil den dælme ikke
- har skrevet

UPDATE <tabelnavn> SET type='Årsag' WHERE type='ÅRDAG';

0 rows updated
Avatar billede holdam Nybegynder
28. januar 2005 - 10:58 #16
Prøv følgende:

SELECT COUNT(*) FROM <tabelnavn> WHERE type='ÅRDAG';

Hvis det (forventeligt) giver 0 rækker, så prøv også:

SELECT DUMP(type) FROM <tabelnavn> WHERE failurelist=1036;

For at se om der har sneget sig blanktegn eller lignende ind i dit type-felt.
Avatar billede rossoneris Nybegynder
28. januar 2005 - 11:10 #17
ELECT COUNT(*) FROM <tabelnavn> WHERE type='ÅRDAG';

Ja - den kom efterfølgende med 0


SELECT DUMP(type) FROM <tabelnavn> WHERE failurelist=1036;



Typ=1 LEN=5: 197,82,68,65,71
Avatar billede holdam Nybegynder
28. januar 2005 - 11:35 #18
Det er altså højst besynderligt, for der står højt og klart 'ÅRDAG' i dit typefelt. Jeg går ud fra at du har kørt begge SELECTs fra samme session?

Måske er det dit 'Å' der driller på en eller anden måde? Ikke fordi det lyder særlig sandsynligt, men alligevel. Prøv lige:

SELECT COUNT(*) FROM <tabelnavn> WHERE type LIKE '_RDAG';
Avatar billede rossoneris Nybegynder
28. januar 2005 - 11:50 #19
Så kommer den med Count(*) : 64
Avatar billede holdam Nybegynder
28. januar 2005 - 12:43 #20
Det bliver mærkeligere og mærkeligere, for du skrev at der kun var 50 rækker der stod ÅRDAG i. Så enten er der 14 rækker indeholdende noget andet end ÅRDAG i type-feltet, men hvor type-feltet består af fem bogstaver og slutter på RDAG. Eller også var der alligevel flere end 50 rækker.

Du kan evt. lave en ny optælling af fordelingen af type-feltet ved

SELECT type, COUNT(*) FROM <tabelnavn> GROUP BY type ORDER BY 1;

Hvis du derefter er overbevist om at de 64 rækker alle indeholder 'ÅRDAG' i type-feltet, kan du opdatere dem til 'ÅRSAG' ved at skrive

UPDATE <tabelnavn> SET type='Årsag' WHERE type LIKE '_RDAG';
Avatar billede rossoneris Nybegynder
28. januar 2005 - 13:22 #21
OK - det er sku lidt mærkeligt. Jeg kørte nedestående

SELECT type, COUNT(*) FROM <tabelnavn> GROUP BY type ORDER BY 1;
Hvor den viser der er 64 steder med Årsag - men istedet for at starte med "Å" ligner det et kors - altså lige a la et "+"

Nu har jeg så rettet det til "Årsag" - men kigger jeg nu i Sqlplus worksheet står der bare en firkantet kasse og så "rsag"

Er det noget med sproget eller ? -
Avatar billede holdam Nybegynder
28. januar 2005 - 13:31 #22
Det er helt sikkert noget tegnsæt-fnidder mellem dit klient-program (sql worksheet eller hvad du nu bruger) og databasen. Hvis du har adgang til isqlplus, er det (for mig at se) den sikreste/nemmeste måde at se dine data på, da dette program er Unicode-baseret.

Hvis du vil være sikker på at der nu står ÅRSAG på samme måde som der før stod ÅRDAG, så gentag:

SELECT DUMP(type) FROM <tabelnavn> WHERE failurelist=1036;

Den skal nu returnere 197,82,83,65,71.

Hvis ikke den gør det, står der noget andet end 'ÅRSAG'
Avatar billede rossoneris Nybegynder
31. januar 2005 - 08:33 #23
Isqlplus - er det noget man kan downloade et sted

Jeg har kørt SELECT DUMP(type) FROM <tabelnavn> WHERE failurelist=1036; - og de samme tal dukker op igen.
Avatar billede holdam Nybegynder
31. januar 2005 - 09:36 #24
isqlplus er en del af Oracle-installationen.

Nu ved jeg jo ikke hvad "de samme tal" betyder. Der har været forskellige undervejs. Men hvis det tredje tal er 68, står der stadig Årdag. Har du commit'tet din ændring?
Avatar billede rossoneris Nybegynder
31. januar 2005 - 09:45 #25
Den retunerer 743,82,83,65,71

Hm ok - hvordan logger man så ind i Isqlplus eller er det ikke sådan lige til ?
Avatar billede holdam Nybegynder
31. januar 2005 - 09:51 #26
Normalt tilgås isqlplus på URL'en http://<servernavn>:5560/isqlplus - men det afhænger selvfølgelig af den aktuelle installation, hvilken port isqlplus lytter på
Avatar billede rossoneris Nybegynder
31. januar 2005 - 10:05 #27
hmm .. Nu er det en Oracle 8 version - er der nogen mulighed for at se hvilken port der lyttes på :-/
Avatar billede holdam Nybegynder
31. januar 2005 - 11:34 #28
Beklager - isqlplus er først med fra Oracle 9. Oracle 8 er i øvrigt ikke længere supporteret
Avatar billede rossoneris Nybegynder
31. januar 2005 - 11:41 #29
Hm ok - findes der ikke et andet værktøj man kan bruge eller, skal jeg "nøjes" med at skrive "A" istedet for "å"
Avatar billede holdam Nybegynder
31. januar 2005 - 15:57 #30
Det kommer noget bag på mig at du får "743" med en SELECT dump(). Normalt returnerer dump værdierne fra hver enkelt byte, men 743 kan ikke være i én byte.

For at komme videre, skal du have fat i databasens tegnsæt. Prøv lige med

SELECT DUMP(type,1010) FROM <tabelnavn> WHERE failurelist=1036;

- så skulle tegnsættet gerne dukke op sammen med værdierne fra de enkelte bytes.

Derefter skulle det være muligt at finde ud af hvad 'Å' er i databasens tegnsæt. Hvis vi antager at Å har værdien 197 (det havde den oprindeligt), så kan du nu skrive

UPDATE <tabelnavn> SET type=CHR(197) || 'rsag' WHERE type LIKE '_RDAG';

- så skulle der meget gerne blive klemt et 'Å' ned i dit type-felt. Om du så kan se det igen med det værktøj du nu bruger til at læse med er åbenbart mere tvivlsomt. Men det vigtigste er vel også at databasen indeholder det rigtige.
Avatar billede rossoneris Nybegynder
01. februar 2005 - 08:28 #31
Ja - kan jo altså se jeg har skrevet forkerrt .. det er "143" og ikke "743" .. :-/
Avatar billede rossoneris Nybegynder
01. februar 2005 - 09:06 #32
SELECT DUMP(type,1010) FROM <tabelnavn> WHERE failurelist=1036;

Kommer med følgende svar: WE8IS08859P1, 143,82,83,65,71

Når jeg kører den her: UPDATE <tabelnavn> SET type=CHR(197) || 'rsag' WHERE type LIKE '_RDAG';

Finder den ingen rækker at opdaterer

Hvordan er det forresten man kan fortryde en handling/kommando (altså inden man har committed) - nu er der ikke sket nogen skade endnu, men det kunne jo ske ;)
Avatar billede rossoneris Nybegynder
04. februar 2005 - 09:13 #33
Kan du hjælpe mig det sidste stykke eller er det ren og skær et mysterie ;-)
Avatar billede holdam Nybegynder
04. februar 2005 - 11:38 #34
Det ser ud som om at du nu faktisk har fået opdateret dine 'Årdag' til 'Årsag. I hvert fald er 143,82,83,65,71 de numeriske værdier for Å,r,s,a,g når din database anvender ISO8859P1 (i MSWIN1252 hedder 'Å' 197).

Så et eller andet er gået godt undervejs! Det er også derfor dit UPDATE-statement ikke finder nogle rækker at opdatere - de er blevet ændret.

Hvis du skal fortryde en kommando, hedder det ROLLBACK (i stedet for COMMIT).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester