2012-07-03 15 views
64

W Oracle PL/SQL, jak uniknąć pojedynczego cudzysłowu w ciągu znaków? Próbowałem w ten sposób, to nie działa.PL/SQL, jak uniknąć pojedynczego cudzysłowu w ciągu znaków?

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

możliwe duplikat [Uciekając apostrof w plsql] (http://stackoverflow.com/questions/6678478/escaping-single-quote-in-plsql) –

Odpowiedz

121

Można użyć dosłowne cytowanie:

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

Dokumentacja dla literałów can be found here.

Alternatywnie, można użyć dwóch cytaty oznaczający pojedynczy cytat:

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

Dosłowne cytowanie mechanizm ze składnią Q jest bardziej elastyczny i czytelny, IMO.

11

Oto a blog post, które powinno pomóc w usuwaniu znaczników w łańcuchach.

Oto najprostszy sposób od wspomnianego postu:

Najprostszym i najczęściej stosowanym sposobem jest użycie apostrofu z dwoma pojedynczymi> cudzysłowie po obu stronach.

WYBIERZ "testuj pojedynczy cytat" od podwójnego;

Wyjście z powyższym stwierdzeniem byłoby:

Test apostrof”

prostu stwierdzając wymagany dodatkowy znak apostrofu wydrukować apostrof> charakter. Oznacza to, że jeśli umieścisz dwie pojedyncze litery, Oracle wydrukuje je. Pierwszy> zachowuje się jak postać ucieczki.

To najprostszy sposób drukowania pojedynczych cudzysłowów w Oracle. Ale stanie się bardziej złożone, gdy będziesz musiał wydrukować zestaw cudzysłowów zamiast jednego. W tej> sytuacji poniższa metoda działa dobrze. Wymaga to jednak więcej pracy przy pisaniu na maszynie.

-3

Wystarczy umieścić następujące oświadczenia przed dla:

set escape '\'; 
+1

Nie miałem -1, ale nie mogłem zmusić tego do działania. – rjdkolb

2

Oprócz odpowiedzi DCookie za wyżej, można również użyć Chr (39) dla jednego cytatu.

Uważam, że jest to szczególnie przydatne, gdy muszę utworzyć wiele instrukcji wstawiania/aktualizowania na podstawie dużej ilości istniejących danych.

Oto bardzo prosty przykład:

Select 'UPDATE Customers SET LName = ' || chr(39) || 'Doe' || chr(39) || ';' From dual; 
Powiązane problemy