PL / SQL, wie kann man einem einfachen Anführungszeichen in einer Zeichenfolge entkommen?

114

Wie kann in Oracle PL / SQL ein einfaches Anführungszeichen in einer Zeichenfolge vermieden werden? Ich habe es so versucht, es funktioniert nicht.

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;
/
user595234
quelle
Mögliches Duplikat von Escaping in Anführungszeichen in PLSQL
Doc Brown

Antworten:

184

Sie können wörtliche Anführungszeichen verwenden:

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

Dokumentation für Literale finden Sie hier .

Alternativ können Sie zwei Anführungszeichen verwenden, um ein einzelnes Anführungszeichen zu kennzeichnen:

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

Der wörtliche Anführungszeichenmechanismus mit der Q-Syntax ist flexibler und lesbarer, IMO.

DCookie
quelle
19

Hier ist ein Blog-Beitrag , der helfen soll, Zecken in Strings zu entkommen.

Hier ist die einfachste Methode aus diesem Beitrag:

Am einfachsten und am häufigsten wird ein einfaches Anführungszeichen mit zwei einfachen> Anführungszeichen auf beiden Seiten verwendet.

SELECT 'test single quote' '' von dual;

Die Ausgabe der obigen Aussage wäre:

einfaches Anführungszeichen testen '

Wenn Sie einfach angeben, benötigen Sie ein zusätzliches einfaches Anführungszeichen, um ein einfaches Anführungszeichen> zu drucken. Wenn Sie zwei einfache Anführungszeichen eingeben, druckt Oracle eines. Der erste verhält sich wie ein Fluchtcharakter.

Dies ist die einfachste Möglichkeit, einfache Anführungszeichen in Oracle zu drucken. Es wird jedoch komplex, wenn Sie statt nur eines eine Reihe von Anführungszeichen drucken müssen. In dieser Situation funktioniert die folgende Methode einwandfrei. Aber es erfordert etwas mehr Schreibarbeit.

cboler
quelle
13

Zusätzlich zu der obigen Antwort von DCookie können Sie auch chr (39) für ein einfaches Anführungszeichen verwenden.

Ich finde dies besonders nützlich, wenn ich eine Reihe von Einfüge- / Aktualisierungsanweisungen erstellen muss, die auf einer großen Menge vorhandener Daten basieren.

Hier ist ein sehr schnelles Beispiel:

Nehmen wir an, wir haben eine sehr einfache Tabelle, Customers, mit zwei Spalten, FirstName und LastName. Wir müssen die Daten in Customers2 verschieben, also müssen wir eine Reihe von INSERT-Anweisungen generieren.

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

Ich habe festgestellt, dass dies sehr nützlich ist, wenn Daten von einer Umgebung in eine andere verschoben werden oder wenn eine Umgebung schnell wiederhergestellt wird.

Corwin01
quelle
0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')';; arbeitete für mich. Das Schließen des varchar/ stringmit zwei Paaren einfacher Anführungszeichen hat den Trick getan. Eine andere Option könnte die Verwendung eines usingSchlüsselworts sein EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'. Denken usingSie daran, dass das Schlüsselwort nicht funktioniert, wenn Sie EXECUTE IMMEDIATEDDLs mit Parametern ausführen. Die Verwendung von Anführungszeichen funktioniert jedoch für DDLs.

Shravan Ramamurthy
quelle