[Oracle] Hoe convert ik long naar varchar?

Pagina: 1
Acties:

  • Togt
  • Registratie: Februari 2000
  • Laatst online: 24-08-2021
Hallo experts,

Ik wil graag een long veld terugkrijgen als varchar, kan dat?

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 18:15
dat kan, maar alleen met PL/SQL


bijv. :

create or replace function long_to_varchar2(p_rowid in rowid, p_from, p_forbytes )
return varchars
is
l_text long;
begin
select column_name into l_text from table_name where rowid = p_rowid;
return substr( l_text, p_from, p_forbytes );
end;
/


(column_name en table_name even replacen)

aanroepen met :

select long_to_varchar2( rowid, 1, 255 ) from table_name;

(1,255 = begin,length)

  • Togt
  • Registratie: Februari 2000
  • Laatst online: 24-08-2021
Wow, bedankt voor het snelle antwoord, ik was ook maar alvast aan de PLSQL begonnen

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 18:15
Op vrijdag 21 juni 2002 10:54 schreef Togt het volgende:
Wow, bedankt voor het snelle antwoord, ik was ook maar alvast aan de PLSQL begonnen
als het even kan gebruik van LONGs elimineren. Het is k*t datatype (je kan bijv ook geen table move doen van een tabel die LONGs bevat, insert as select werkt niet met LONGS, en ook Oracle 'Advanced' Replication werkt niet met LONGs)

edit: Oracle adviseert het gebruik van LOBs ipv LONGs overigens.

  • Wally-S
  • Registratie: September 2001
  • Laatst online: 21:20

Wally-S

-Snowboarding is art-

Hallo,

Ik weet het, een heel oud topic, maar mijn vraag is bijna hetzelfde vandaar deze kick.

Ik wil een een long-veld uit tabelA inserten in een varchar2 veld uit tabelB.
Bovenstaande oplossing werkt technisch gezien goed.
Het probleem is dat de tabellen waar ik mee werk miljoenen records hebben.
Bij de functie wordt iedere keer de hele tabel afgezocht naar het goede record. Bij deze aantallen is de performance dan om te huilen.
Wat ik eigenlijk zoek is een functie waar ik het longveld als parameter mee kan geven en deze vervolgens een varchar2 veld retourneerd.
Ik heb al veel gezocht op de oracle site en zelf veel geprobeerd, maar het lijkt erop dat een longveld niet als parameter aan een functie meegegeven kan worden.
Weet iemand of dit mogelijk is?

Als zo een functie niet mogelijk is weet iemand misschien hoe dit performance technisch gezien beter opgelost kan worden.

Snow is only frozen water


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zal 'm nu zo laten aangezien er toch niet veel reacties waren, maar het is op zich handiger als je voortaan een nieuw topic opent, evt. met een linkje naar de oude ter referentie :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 22:51

JaQ

Wally-S schreef op 05 november 2004 @ 14:12:
Hallo,

Ik weet het, een heel oud topic, maar mijn vraag is bijna hetzelfde vandaar deze kick.

Ik wil een een long-veld uit tabelA inserten in een varchar2 veld uit tabelB.
Bovenstaande oplossing werkt technisch gezien goed.
Het probleem is dat de tabellen waar ik mee werk miljoenen records hebben.
Bij de functie wordt iedere keer de hele tabel afgezocht naar het goede record. Bij deze aantallen is de performance dan om te huilen.
Wat ik eigenlijk zoek is een functie waar ik het longveld als parameter mee kan geven en deze vervolgens een varchar2 veld retourneerd.
Ik heb al veel gezocht op de oracle site en zelf veel geprobeerd, maar het lijkt erop dat een longveld niet als parameter aan een functie meegegeven kan worden.
Weet iemand of dit mogelijk is?

Als zo een functie niet mogelijk is weet iemand misschien hoe dit performance technisch gezien beter opgelost kan worden.
Nee het is niet mogelijk om een long mee te geven aan een functie. Wel zou je natuurlijk een procedure kunnen schrijven die de hele rij ophaalt mbv een cursor en daarmee een insert doet.

Let wel even op dat de voorgestelde oplossing enkel maar een X aantal tekens van de long ophaalt. Op metalink.oracle.com en technet.oracle.com kan je ladingen voorbeelden vinden hoe je dat beter kan doen (stukje voor stukje in een string inlezen en dan inserten)

success.

Egoist: A person of low taste, more interested in themselves than in me


  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 18:15
Wally-S schreef op 05 november 2004 @ 14:12:
Bij de functie wordt iedere keer de hele tabel afgezocht naar het goede record.
Nee, je geeft het rowid mee. Dit is de meest directe manier om een rij in een tabel te specificeren. Er wordt dus zeker niet door de hele tabel gezocht. Als dit wel zo zou zijn dan zou 1 enkele insert al enkele seconden duren.
Wat ik eigenlijk zoek is een functie waar ik het longveld als parameter mee kan geven en deze vervolgens een varchar2 veld retourneerd.
Ik heb al veel gezocht op de oracle site en zelf veel geprobeerd, maar het lijkt erop dat een longveld niet als parameter aan een functie meegegeven kan worden.
Weet iemand of dit mogelijk is?
LONGs als parameters zijn helaas niet mogelijk. Dus ook 2 jaar na m'n eerste opmerking in dit topic heb ik nog steeds een grote hekel aan dit irritante datatype ;)

Een paar mogelijke opties:

- Plaats de gehele insert in een PL/SQL block. In dat geval kan je simpelweg een cursor openen en middels een LOOP constructie je LONGs inlezen en weer wegschrijven.

- Gebruik het COPY command in SQL*Plus. Deze kan LONG columns naar LONG columns kopieren (zelfs via DB link) en waarschijnlijk ook LONG naar VARCHAR2. Zie Oracle docs voor details. Let wel, het COPY command is aangemerkt als 'obsolete in future versions', maar goed dat zeggen ze ook al jaren over het LONG datatype.

- Als het gaat om miljoenen rijen per keer en maintenancekosten zijn ondergeschikt, dan is het gebruik van SQLLoader misschien het overwegen waard. Spool de te inserten data uit tabel A naar een (bijv. comma delimited) flat file en laadt deze vervolgens mbv SQLLoader in tabel B.
Pagina: 1