Domanda

Ok, la domanda è un po' oscura, ma spero che qualcuno possa aiutarmi.

Il sistema su cui sto lavorando crea una stringa SQL dinamica per l'esecuzione all'interno di una procedura memorizzata e parte di quell'SQL dinamico definisce gli alias di colonna, che a loro volta sono in realtà valori recuperati da un'altra tabella di dati generati dall'utente.

Quindi, ad esempio, la stringa potrebbe assomigliare a;

SELECT table1.Col1 AS "This is an alias" FROM table1

Funziona bene.Tuttavia, il valore utilizzato per l'alias può potenzialmente contenere un carattere di virgolette doppie, che interrompe le virgolette esterne.Pensavo che in qualche modo avrei potuto evitare le virgolette doppie all'interno dell'alias, ma non ho avuto fortuna nel capire come farlo.La barra rovesciata non funziona e l'utilizzo di due virgolette doppie di seguito genera questo errore;

SQL Error: ORA-03001: unimplemented feature
03001. 00000 -  "unimplemented feature"
*Cause:    This feature is not implemented.

Qualcuno ha già avuto esperienza con questo problema?Saluti per qualsiasi intuizione che qualcuno abbia.

p.s.le virgolette sono necessarie attorno agli alias perché possono contenere spazi.

È stato utile?

Soluzione

Puoi semplicemente inserire un altro carattere invece delle virgolette doppie e sostituirlo con virgolette doppie nel codice?

Qualcosa come questo:

SELECT table1.Col1 AS "This is |not| an alias" FROM table1

Quindi basta sostituire | con ".

So che è un trucco, ma non riesco a pensare a una soluzione migliore...E quello che stai facendo lì è comunque un hack.Il modo "carino" sarebbe selezionare i valori e i nomi delle colonne separatamente e associarli nel codice.Ciò renderebbe le cose molto più pulite.

Altri suggerimenti

utilizzare l'operatore quote Oracle:

select q'#someone's quote#' from dual;

il '#' può essere sostituito da qualsiasi carattere

Quando eseguo questo:

select 'test"columnname"' from dual

Oracle restituisce questo (nota il nome della colonna generata da Oracle):

'TESTCOLUMNNAME'
--------------------------------
test"columnname

Il fatto che il nome della colonna di Oracle non includa le mie virgolette doppie mi dice che Oracle probabilmente non può rappresentarlo.

La soluzione migliore, per quanto posso vedere, è eliminare le virgolette doppie dai dati prima di utilizzare i nomi delle colonne.Purtroppo, ciò richiederà anche che tu esegua lo stesso filtraggio quando tu Selezionare quelle colonne, ma non vedo un altro modo.

un'area di indagine forse fruttuosa sarebbe quella di esaminare il metodo della quotazione.

my $stringaquoted = $dbh->quote( $stringa);

Prova questo, due virgolette singole in realtà sembrano una virgoletta doppia nell'output:
select 1 as "University ''John Smith''" from dual;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top