PL / SQL, làm thế nào để thoát khỏi dấu nháy đơn trong một chuỗi?


114

Trong Oracle PL / SQL, làm thế nào để thoát khỏi dấu nháy đơn trong một chuỗi? Tôi đã thử cách này, nó không hoạt động.

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

Câu trả lời:


184

Bạn có thể sử dụng trích dẫn theo nghĩa đen:

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

Tài liệu cho các chữ có thể được tìm thấy ở đây .

Ngoài ra, bạn có thể sử dụng hai dấu ngoặc kép để biểu thị một dấu ngoặc kép:

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

Cơ chế trích dẫn theo nghĩa đen với cú pháp Q linh hoạt và dễ đọc hơn, IMO.


19

Đây là một bài đăng trên blog sẽ giúp thoát tick trong chuỗi.

Đây là phương pháp đơn giản nhất từ ​​bài đăng đã nói:

Cách đơn giản nhất và được sử dụng nhiều nhất là sử dụng một dấu ngoặc kép với hai dấu ngoặc kép đơn> ở cả hai bên.

CHỌN 'kiểm tra trích dẫn đơn' '' từ kép;

Kết quả của câu lệnh trên sẽ là:

kiểm tra báo giá đơn '

Chỉ cần nói rằng bạn yêu cầu thêm một ký tự trích dẫn duy nhất để in một ký tự> trích dẫn duy nhất. Đó là nếu bạn đặt hai ký tự trích dẫn đơn thì Oracle sẽ in một ký tự. Đầu tiên> một hoạt động giống như một nhân vật thoát.

Đây là cách đơn giản nhất để in dấu ngoặc kép trong Oracle. Nhưng nó sẽ trở nên phức tạp khi bạn phải in một tập hợp các dấu ngoặc kép thay vì chỉ một. Trong tình huống này, phương pháp sau hoạt động tốt. Nhưng nó đòi hỏi nhiều lao động đánh máy hơn.


13

Ngoài câu trả lời của DCookie ở trên, bạn cũng có thể sử dụng chr (39) cho một trích dẫn duy nhất.

Tôi thấy điều này đặc biệt hữu ích khi tôi phải tạo một số câu lệnh chèn / cập nhật dựa trên một lượng lớn dữ liệu hiện có.

Đây là một ví dụ rất nhanh:

Giả sử chúng ta có một bảng rất đơn giản, Khách hàng, có 2 cột, FirstName và LastName. Chúng ta cần chuyển dữ liệu vào Customer2, vì vậy chúng ta cần tạo một loạt các câu lệnh INSERT.

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

Tôi thấy điều này rất hữu ích khi di chuyển dữ liệu từ môi trường này sang môi trường khác hoặc khi xây dựng lại môi trường một cách nhanh chóng.


0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; đã làm cho tôi. đóng dấu varchar/ stringvới hai cặp dấu ngoặc kép đã làm một mẹo nhỏ. Tùy chọn khác có thể là sử dụng usingtừ khóa , EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; usingTừ khóa Remember sẽ không hoạt động, nếu bạn đang sử dụng EXECUTE IMMEDIATEđể thực thi DDL với các tham số, tuy nhiên, sử dụng dấu ngoặc kép sẽ hoạt động cho DDL.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.