Avatar billede conrad Nybegynder
12. september 2007 - 10:33 Der er 9 kommentarer og
1 løsning

opbygning af ekstern streng -problemer med enkelt og dobbel pling

Fra et eksterns system (Dynamics Ax tidl Axapta) opbygger jeg en streng som (forkortet) ser således ud:

execute immediate \'create global temporary table %2_TMP ON COMMIT PRESERVE ROWS as select field_1 from MYTABLE ' +
            ' where NLS_LOWER(field_1) = NLS_LOWER(N'aaa')<<<<PROBLEM '+...

Det der lader til at være mit problem er at den første ' bliver "afbrudt" af den der kommer ved N'aaa'. Såfremt jeg hardcoder "aaa" (dobbelt pling) er der ingen problemer. Dette er dog ikke en mulighed, da N'aaa' bliver udleveret via en platforms afhængig metode.

Jeg har prøvet at erstatte de yderste ' ' med " " men så får jeg følgende fejl:ORA-00972 Identifier is to long

Hvordan kan jeg får jeg opbygget en streng som Oracle vil acceptere?
Avatar billede holdam Nybegynder
12. september 2007 - 10:58 #1
Normalt skal enkelt-plingerne ved N'aaa' i et sådant tilfælde erstattes med to enkelt-plinger: N''aaa'' - men det kan jeg ikke lige gennemskue om du har mulighed for at gøre?
Avatar billede conrad Nybegynder
12. september 2007 - 11:06 #2
ikke umiddelbart, nej :(
Avatar billede holdam Nybegynder
12. september 2007 - 12:28 #3
Måske kan du bruge bind variable i dit EXECUTE IMMEDIATE?

Det skulle blive noget i retning af:

EXECUTE IMMEDIATE 'CREATE <...> WHERE NLS_LOWER(field_1) = NLS_LOWER(:f1)' USING N'aaa'
Avatar billede conrad Nybegynder
12. september 2007 - 15:04 #4
Jeg er desværre ikke den store Oracle haj, så er der nogen chance for du kan forklare bind variable? eller smide et link? Har selv prøvet at søge men uden den store succes
Avatar billede holdam Nybegynder
12. september 2007 - 15:32 #5
Her er et link: http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14261/dynamic.htm

Bind variable bruges eksempelvis når man vil kunne genbruge parsningen af ens cursor, så man ikke fylder SGAen op med næsten-ens statements.

Det var dog ikke det primære formål i denne sammenhæng - det var ment som et eksempel til at omgå en syntaktisk begrænsning.
Avatar billede conrad Nybegynder
12. september 2007 - 15:50 #6
Jeg troede næsten den var er, men så får jeg fejlen:
ORA-01027
ORA-01027: bind variables not allowed for data definition operations
Cause: An attempt was made to use a bind variable in a SQL data definition operation.
Action: Such bind variables are not allowed.

så det er lidt op ad bakke
Avatar billede holdam Nybegynder
12. september 2007 - 20:33 #7
En mulighed er så at dele dit statement i to:

1) EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE %2_TMP (field_1 <datatype>)';
2) EXECUTE IMMEDIATE 'INSERT INTO %2_TMP SELECT field_1 FROM  mytable WHERE NLS_LOWER'(field_1) <osv.osv.>' USING N'aaa';

I øvrigt kan du så sikkert udføre 2) direkte i PL/SQL uden brug af EXECUTE IMMEDIATE. Men det kan også gøres med.
Avatar billede conrad Nybegynder
17. september 2007 - 15:18 #8
Det lykkedes mig at komme igennem ved at bruge bind variable og opdele i flere statements. Tusind tak for hjælpen! Lægger du et svar?
Avatar billede holdam Nybegynder
17. september 2007 - 15:51 #9
Her er et svar!
Avatar billede holdam Nybegynder
17. september 2007 - 15:51 #10
Næ - det foregående var endnu en kommentar. Dette er et svar!
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