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)
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)
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)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
edit: Oracle adviseert het gebruik van LOBs ipv LONGs overigens.
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.
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
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.
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.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.
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
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.Wally-S schreef op 05 november 2004 @ 14:12:
Bij de functie wordt iedere keer de hele tabel afgezocht naar het goede record.
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 datatypeWat 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?
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