PL / SQL จะหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยวในสตริงได้อย่างไร


114

ใน Oracle PL / SQL จะหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยวในสตริงได้อย่างไร ฉันลองวิธีนี้แล้วไม่ได้ผล

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

เป็นไปได้ที่จะซ้ำกันของการหลีกเลี่ยงคำพูดเดี่ยวใน PLSQL
Doc Brown

คำตอบ:


184

คุณสามารถใช้การอ้างอิงตามตัวอักษร:

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

เอกสารสำหรับตัวอักษรที่สามารถพบได้ที่นี่

หรือคุณสามารถใช้เครื่องหมายคำพูดสองคำเพื่อแสดงคำพูดเดียว:

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

กลไกการอ้างอิงตามตัวอักษรพร้อมไวยากรณ์ Q มีความยืดหยุ่นและอ่านได้มากกว่า IMO


19

นี่คือบล็อกโพสต์ที่จะช่วยในการหลีกเลี่ยงเห็บในสตริง

นี่เป็นวิธีที่ง่ายที่สุดจากโพสต์ดังกล่าว:

วิธีที่ง่ายที่สุดและใช้มากที่สุดคือการใช้เครื่องหมายคำพูดเดี่ยวกับเครื่องหมายคำพูด> เครื่องหมายคำพูดเดี่ยวสองตัวในทั้งสองด้าน

เลือก 'test single quote' '' จาก dual;

ผลลัพธ์ของข้อความข้างต้นจะเป็น:

ทดสอบใบเสนอราคาเดียว '

เพียงระบุว่าคุณต้องการอักขระอัญประกาศเพิ่มเติมเพื่อพิมพ์ใบเสนอราคาเดี่ยว> อักขระ นั่นคือถ้าคุณใส่เครื่องหมายคำพูดเดี่ยวสองตัว Oracle จะพิมพ์หนึ่งตัว ตัวแรก> หนึ่งทำหน้าที่เหมือนอักขระหลบหนี

นี่เป็นวิธีที่ง่ายที่สุดในการพิมพ์เครื่องหมายคำพูดเดี่ยวใน Oracle แต่จะได้รับ> ซับซ้อนเมื่อคุณต้องพิมพ์ชุดของเครื่องหมายคำพูดแทนที่จะเป็นเพียงอันเดียว ในสถานการณ์นี้วิธีการต่อไปนี้ใช้ได้ดี แต่ต้องใช้แรงงานในการพิมพ์มากขึ้น


13

นอกจากคำตอบของ DCookie ข้างต้นแล้วคุณยังสามารถใช้ chr (39) สำหรับคำพูดเดียวได้อีกด้วย

ฉันพบว่าสิ่งนี้มีประโยชน์อย่างยิ่งเมื่อต้องสร้างคำสั่งแทรก / อัปเดตจำนวนมากโดยอิงจากข้อมูลที่มีอยู่จำนวนมาก

นี่คือตัวอย่างสั้น ๆ :

สมมติว่าเรามีตารางที่เรียบง่ายลูกค้าซึ่งมี 2 คอลัมน์ FirstName และ LastName เราจำเป็นต้องย้ายข้อมูลไปยังลูกค้า 2 ดังนั้นเราจึงต้องสร้างคำสั่ง INSERT จำนวนมาก

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

ฉันพบว่าสิ่งนี้มีประโยชน์มากเมื่อย้ายข้อมูลจากสภาพแวดล้อมหนึ่งไปยังอีกสภาพแวดล้อมหนึ่งหรือเมื่อสร้างสภาพแวดล้อมใหม่อย่างรวดเร็ว


0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; ทำงานให้ฉัน การปิดvarchar/ stringด้วยเครื่องหมายคำพูดเดี่ยวสองคู่เป็นการหลอกลวง ตัวเลือกอื่น ๆ สามารถใช้usingคำสำคัญEXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; จำusingคำหลักจะไม่ทำงานหากคุณใช้EXECUTE IMMEDIATEเพื่อดำเนินการ DDL ด้วยพารามิเตอร์อย่างไรก็ตามการใช้เครื่องหมายคำพูดจะใช้ได้กับ DDL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.