PL / SQL, jak wyjść z pojedynczego cudzysłowu w ciągu znaków?

114

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;
/
user595234
źródło
możliwy duplikat Escaping pojedynczego cudzysłowu w PLSQL
Doc Brown

Odpowiedzi:

184

Możesz użyć dosłownego cytowania:

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

Dokumentację literałów można znaleźć tutaj .

Alternatywnie możesz użyć dwóch cudzysłowów, aby oznaczyć pojedynczy cytat:

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

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

DCookie
źródło
19

Oto post na blogu, który powinien pomóc w unikaniu kleszczy w łańcuchach.

Oto najprostsza metoda ze wspomnianego postu:

Najprostszym i najczęściej używanym sposobem jest użycie pojedynczego cudzysłowu z dwoma pojedynczymi> cudzysłowami po obu stronach.

SELECT 'test single quote' '' from dual;

Wynik powyższej instrukcji byłby:

przetestuj pojedynczy cudzysłów '

Po prostu zaznacz, że potrzebujesz dodatkowego pojedynczego znaku cudzysłowu, aby wydrukować pojedynczy znak cudzysłowu>. Oznacza to, że jeśli umieścisz dwa pojedyncze znaki cudzysłowu, Oracle wydrukuje jeden. Pierwsza> zachowuje się jak znak ucieczki.

To najprostszy sposób drukowania pojedynczych cudzysłowów w Oracle. Ale stanie się> skomplikowane, gdy będziesz musiał wydrukować zestaw cudzysłowów zamiast tylko jednego. W tej> sytuacji następująca metoda działa dobrze. Ale wymaga to więcej pracy przy pisaniu.

cboler
źródło
13

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.

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

Zauważyłem, że jest to bardzo przydatne podczas przenoszenia danych z jednego środowiska do drugiego lub podczas szybkiego odbudowywania środowiska.

Corwin01
źródło
0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; pracował dla mnie. zamknięcie varchar/ stringdwoma parami pojedynczych cudzysłowów załatwiło sprawę. Inną opcją może być użycie usingsłowa kluczowego EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002',; Pamiętaj, że usingsłowo kluczowe nie będzie działać, jeśli używasz EXECUTE IMMEDIATEdo wykonywania DDL z parametrami, jednak używanie cudzysłowów będzie działać dla DDL.

Shravan Ramamurthy
źródło