PL / SQL, bir dizedeki tek tırnaktan nasıl kaçılır?


114

Oracle PL / SQL'de, bir dizedeki tek tırnaktan nasıl kaçılır? Bu şekilde denedim, çalışmıyor.

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

Yanıtlar:


184

Değişmez alıntı kullanabilirsiniz:

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

Değişmez bilgiler için belgeler burada bulunabilir .

Alternatif olarak, tek bir alıntıyı belirtmek için iki tırnak kullanabilirsiniz:

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

Q sözdizimi ile gerçek alıntı mekanizması daha esnek ve okunabilir, IMO.


19

İşte dizelerde kenelerin kaçmasına yardımcı olması gereken bir blog yazısı .

İşte söz konusu gönderiden en basit yöntem:

En basit ve en çok kullanılan yol, her iki tarafında iki tek> tırnak işareti olan tek bir tırnak işareti kullanmaktır.

Dualden 'tek alıntı test et' '' öğesini seçin;

Yukarıdaki ifadenin çıktısı şöyle olacaktır:

tek alıntı test et '

Basitçe, tek bir tırnak> karakteri yazdırmak için ek bir tek tırnak karakterine ihtiyacınız olduğunu belirtmek. Yani iki tek tırnak karakteri koyarsanız, Oracle bir tane yazacaktır. İlki> bir kaçış karakteri gibi davranır.

Bu, Oracle'da tek tırnak işareti yazdırmanın en basit yoludur. Ancak, tek bir tırnak yerine bir dizi tırnak işareti yazdırmanız gerektiğinde,> karmaşık hale gelecektir. Bu durumda> aşağıdaki yöntem işe yarar. Ama biraz daha yazı yazmayı gerektiriyor.


13

DCookie'nin yukarıdaki cevabına ek olarak, tek bir alıntı için chr (39) da kullanabilirsiniz.

Büyük miktarda mevcut veriye dayalı olarak bir dizi ekleme / güncelleme ifadesi oluşturmam gerektiğinde bunu özellikle yararlı buluyorum.

İşte çok hızlı bir örnek:

Diyelim ki, FirstName ve LastName olmak üzere 2 sütunlu, Müşteriler adlı çok basit bir tablomuz var. Verileri Müşteriler2'ye taşımamız gerekiyor, bu yüzden bir sürü INSERT ifadesi oluşturmamız gerekiyor.

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

Verileri bir ortamdan diğerine taşırken veya bir ortamı hızla yeniden oluştururken bunu çok yararlı buldum.


0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; benim için çalıştı. kapanış varchar/ stringtek tırnak iki çift ile hile yaptı. Diğer seçenek, usinganahtar kelime kullanmak olabilir EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; DDL'leri parametrelerle çalıştırmak usingiçin kullanıyorsanız anahtar kelimenin çalışmayacağını unutmayın EXECUTE IMMEDIATE, ancak tırnak işaretleri kullanmak DDL'ler için işe yarayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.