PL / SQL, bagaimana cara melarikan diri dari kutipan tunggal dalam sebuah string?

114

Di Oracle PL / SQL, bagaimana cara menghindari kutipan tunggal dalam string? Saya mencoba cara ini, tidak berhasil.

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;
/
pengguna595234
sumber
kemungkinan duplikat Kutipan tunggal yang lolos
Doc Brown

Jawaban:

184

Anda dapat menggunakan kutipan literal:

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

Dokumentasi untuk literal dapat ditemukan di sini .

Atau, Anda dapat menggunakan dua tanda kutip untuk menunjukkan satu kutipan:

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

Mekanisme kutipan literal dengan sintaks Q lebih fleksibel dan dapat dibaca, IMO.

DCookie
sumber
19

Berikut adalah posting blog yang akan membantu menghilangkan tanda centang dalam string.

Inilah metode paling sederhana dari posting tersebut:

Cara yang paling sederhana dan paling sering digunakan adalah dengan menggunakan satu tanda kutip dengan dua tanda kutip tunggal> di kedua sisi.

PILIH 'uji kutipan tunggal' '' dari ganda;

Output dari pernyataan di atas adalah:

uji kutipan tunggal '

Cukup menyatakan bahwa Anda memerlukan karakter kutipan tunggal tambahan untuk mencetak karakter kutip tunggal. Artinya jika Anda meletakkan dua karakter kutipan tunggal Oracle akan mencetak satu. Yang pertama> satu bertindak seperti karakter melarikan diri.

Ini adalah cara termudah untuk mencetak tanda kutip tunggal di Oracle. Tapi akan> kompleks ketika Anda harus mencetak satu set tanda kutip, bukan hanya satu. Dalam situasi> ini, metode berikut berfungsi dengan baik. Tapi itu membutuhkan lebih banyak tenaga pengetikan.

cboler
sumber
13

Selain jawaban DCookie di atas, Anda juga dapat menggunakan chr (39) untuk satu kutipan.

Saya merasa ini sangat berguna ketika saya harus membuat sejumlah pernyataan penyisipan / pembaruan berdasarkan sejumlah besar data yang ada.

Berikut contoh yang sangat cepat:

Katakanlah kita memiliki tabel yang sangat sederhana, Pelanggan, yang memiliki 2 kolom, NamaDepan dan NamaBelakang. Kita perlu memindahkan data ke Pelanggan2, jadi kita perlu membuat sekumpulan pernyataan INSERT.

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

Saya merasa ini sangat berguna saat memindahkan data dari satu lingkungan ke lingkungan lain, atau saat membangun kembali lingkungan dengan cepat.

Corwin01
sumber
0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; bekerja untuk saya. menutup varchar/ stringdengan dua pasang tanda kutip tunggal berhasil. Pilihan lainnya adalah menggunakan usingkata kunci EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002',; Ingat usingkata kunci tidak akan berfungsi, jika Anda menggunakan EXECUTE IMMEDIATEuntuk mengeksekusi DDL dengan parameter, namun, menggunakan tanda kutip akan berfungsi untuk DDL.

Shravan Ramamurthy
sumber