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.
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;
/
Odpowiedzi:
Możesz użyć dosłownego cytowania:
Dokumentację literałów można znaleźć tutaj .
Alternatywnie możesz użyć dwóch cudzysłowów, aby oznaczyć pojedynczy cytat:
Dosłowny mechanizm cytowania ze składnią Q jest bardziej elastyczny i czytelny, IMO.
źródło
Oto post na blogu, który powinien pomóc w unikaniu kleszczy w łańcuchach.
Oto najprostsza metoda ze wspomnianego postu:
źródło
Oprócz powyższej odpowiedzi DCookie, możesz również użyć chr (39) do pojedynczego cytatu.
Uważam to za szczególnie przydatne, gdy muszę utworzyć wiele instrukcji wstawiania / aktualizowania na podstawie dużej ilości istniejących danych.
Oto bardzo szybki przykład:
Powiedzmy, że mamy bardzo prostą tabelę, Klienci, która ma 2 kolumny: Imię i Nazwisko. Musimy przenieść dane do klientów2, więc musimy wygenerować zestaw instrukcji INSERT.
Zauważyłem, że jest to bardzo przydatne podczas przenoszenia danych z jednego środowiska do drugiego lub podczas szybkiego odbudowywania środowiska.
źródło
EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'
; pracował dla mnie. zamknięcievarchar
/string
dwoma parami pojedynczych cudzysłowów załatwiło sprawę. Inną opcją może być użycieusing
słowa kluczowegoEXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'
,; Pamiętaj, żeusing
słowo kluczowe nie będzie działać, jeśli używaszEXECUTE IMMEDIATE
do wykonywania DDL z parametrami, jednak używanie cudzysłowów będzie działać dla DDL.źródło