2012-07-03 16 views
64

In Oracle PL/SQL, come evitare una virgoletta singola in una stringa? Ho provato in questo modo, non funziona.PL/SQL, come evitare una virgoletta singola in una stringa?

declare 
    stmt varchar2(2000); 
begin 
    for i in 1021 .. 6020 
    loop 
    stmt := 'insert into MY_TBL (Col) values(\'ER0002\')'; 

    dbms_output.put_line(stmt); 
    execute immediate stmt; 
    commit; 
    end loop; 
exception 
    when others then 
    rollback; 
    dbms_output.put_line(sqlerrm); 
end; 
/
+0

possibile duplicato del [Sfuggire apice singolo in PLSQL] (http://stackoverflow.com/questions/6678478/escaping-single-quote-in-plsql) –

risposta

121

È possibile utilizzare letterale citando:

stmt := q'[insert into MY_TBL (Col) values('ER0002')]'; 

documentazione per letterali can be found here.

In alternativa, è possibile utilizzare due citazioni per indicare una sola citazione:

stmt := 'insert into MY_TBL (Col) values(''ER0002'')'; 

Il meccanismo citando letteralmente con la sintassi Q è più flessibile e leggibile, IMO.

11

Questo è il a blog post che dovrebbe aiutare a sfuggire alle zecche nelle stringhe.

Ecco il metodo più semplice da detto posto:

Il modo più semplice e più utilizzato è quello di utilizzare una virgoletta singola con due singoli> virgolette in entrambi i lati.

SELEZIONA 'prova singola quota' '' da doppia;

L'uscita della dichiarazione di cui sopra sarebbe:

prova apice singolo'

Semplicemente affermando si richiede un carattere aggiuntivo sola citazione per stampare una singola quote> carattere. Cioè se metti due caratteri a virgoletta singola, Oracle stamperà uno. Il primo> uno si comporta come un personaggio di fuga.

Questo è il modo più semplice per stampare virgolette singole in Oracle. Ma diventerà> complesso quando devi stampare una serie di virgolette invece di una sola. In questa situazione il seguente metodo funziona bene. Ma richiede un po 'più di lavoro di battitura.

-3

Basta mettere la seguente dichiarazione prima della PER:

set escape '\'; 
+1

Non ho -1, ma non ho potuto farlo funzionare. – rjdkolb

2

Oltre alla risposta di DCookie sopra, è anche possibile utilizzare chr (39) per un solo preventivo.

Lo trovo particolarmente utile quando devo creare un numero di istruzioni di inserimento/aggiornamento basate su una grande quantità di dati esistenti.

Ecco un esempio molto semplice:

Select 'UPDATE Customers SET LName = ' || chr(39) || 'Doe' || chr(39) || ';' From dual; 
Problemi correlati