PL / SQL, come sfuggire alle virgolette singole in una stringa?


114

In Oracle PL / SQL, come eseguire l'escape di virgolette singole in una stringa? Ho provato in questo modo, non funziona.

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;
/

Risposte:


184

Puoi usare la citazione letterale:

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

La documentazione per i letterali può essere trovata qui .

In alternativa, puoi utilizzare due virgolette per denotare una singola citazione:

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

Il meccanismo di citazione letterale con la sintassi Q è più flessibile e leggibile, IMO.


19

Ecco un post sul blog che dovrebbe aiutare a sfuggire ai tick nelle stringhe.

Ecco il metodo più semplice da detto post:

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

SELEZIONA 'prova virgoletta singola' '' da doppia;

L'output dell'istruzione precedente sarebbe:

prova virgolette singole '

Semplicemente affermando che è necessario un carattere di virgoletta singola aggiuntivo per stampare un carattere di virgoletta singola>. Cioè se metti due virgolette singole, Oracle ne stamperà uno. Il primo> si comporta come un personaggio di fuga.

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


13

Oltre alla risposta di DCookie sopra, puoi anche usare chr (39) per una singola citazione.

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

Ecco un esempio molto veloce:

Diciamo che abbiamo una tabella molto semplice, Clienti, che ha 2 colonne, FirstName e LastName. Dobbiamo spostare i dati in Customers2, quindi dobbiamo generare una serie di istruzioni INSERT.

Select 'INSERT INTO Customers2 (FirstName, LastName) ' ||
       'VALUES (' || chr(39) || FirstName || chr(39) ',' || 
       chr(39) || LastName || chr(39) || ');' From Customers;

Ho trovato questo molto utile quando si sposta i dati da un ambiente a un altro o quando si ricostruisce rapidamente un ambiente.


0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; ha funzionato per me. chiudere la varchar/ stringcon due coppie di virgolette singole ha funzionato. Un'altra opzione potrebbe essere quella di utilizzare la usingparola chiave EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002',; Ricorda che la usingparola chiave non funzionerà, se stai usando EXECUTE IMMEDIATEper eseguire DDL con parametri, tuttavia, l'uso di virgolette funzionerà per DDL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.