Hoe maak je een varchar2-veld korter in Oracle?

Ik heb een veld in een tabel die varchar2, 4000 bytes is. Er zijn meer dan 50000 rijen. Niet alle rijen bevatten gegevens in dit veld. Weinig gegevensvelden zijn meer dan 255 bytes, maar sommige zijn 4000. Om de tabel in een nieuwe toepassing te plaatsen, moet ik het veld inkorten tot 255 bytes.

Is er een SQL-instructie die de lengte tot 255 verkleint? Ik besef dat gegevens verloren gaan, dat is een deel van de kosten van de nieuwe applicatie. De snede moet willekeurig zijn, gewoon stoppen met de gegevens op 255, ongeacht de omstandigheden.

8
update en substring
toegevoegd de auteur xQbert, de bron

1 antwoord

update b set text2 = substr(text2,1,255);

vervolgens tabel wijzigen om de kolomlengte in te stellen op 255 :

alter table b MODIFY "TEXT2" varchar2(255 byte);
28
toegevoegd
Dank u zeer!
toegevoegd de auteur user761758, de bron
@xQbert En voor het nummertype hoe dat te doen, wil ik mijn ingediende type wijzigen van nummer in nummer (3) dank u: D
toegevoegd de auteur Chlebta, de bron
Overeengekomen met Kevin. De tijd die nodig is om de lengte van een string te krijgen is minimaal, maar het werk dat nodig is om een ​​rij bij te werken is veel groter in vergelijking.
toegevoegd de auteur Jeffrey Kemp, de bron
THEORIE VRAAG: Ik ben benieuwd hoe dit zou helpen. op het eerste gezicht ben ik het ermee eens dat dit zou moeten. Maar toen ik eraan begon te denken, begon ik me af te vragen. met de waar zou het eerst een lengte moeten doen (performance hit) Op IEDERE plaat als ik eraan twijfel is er een index op de lengte. dan moet het naar de substring. Dus het lijkt mij dat het misschien zelfs langzamer is. gewoon met behulp van de str, het doet de telling een keer voor elke record en stopt elke keer bij 255 of het einde van de string. terwijl het in de lengte alles moet tellen. doe dan de subtekenreeks. Gewoon stof tot nadenken.
toegevoegd de auteur xQbert, de bron
over waarom CHAR vs BYTE belangrijk zou zijn ... stackoverflow.com/questions/81448/…
toegevoegd de auteur xQbert, de bron
net als ik na het uitvoeren van een test met 370k-records en het zien van iets lagere kosten dan het niet gebruiken van de where-limiet. (54521 vs 54579) een kostenbesparing van 58, maar ik denk dat dit zou variëren met betrekking tot het aantal records over/onder de 255-limiet.
toegevoegd de auteur xQbert, de bron
@Chlebta, dat is een andere vraag. Stel je voor, ik weet zeker dat je een antwoord krijgt.
toegevoegd de auteur xQbert, de bron
aangezien er slechts een paar rijen zijn, zou ik alleen de records bijwerken die te groot zijn ... voeg WHERE LENGTH (text2)> 255
toegevoegd de auteur Kevin Burton, de bron
het zou afhangen of er ook UPDATE-triggers op de tafel zouden verschijnen.
toegevoegd de auteur ShoeLace, de bron
eigenlijk wilt u dat u waarlijk wijzigt in tabel b WIJZIGEN "TEXT2" varchar2 (255 CHAR); CHAR niet BYTE
toegevoegd de auteur ShoeLace, de bron