2012-07-03 9 views
64

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.PL/SQL, làm thế nào để thoát khỏi dấu nháy đơn trong một chuỗi?

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

thể trùng lặp của [Thoát quote duy nhất trong PLSQL] (http://stackoverflow.com/questions/6678478/escaping-single-quote-in-plsql) –

Trả lời

121

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

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

Tài liệu cho literals can be found here.

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

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

Cơ chế trích đen với cú pháp Q là linh hoạt hơn và có thể đọc được, IMO.

11

Dưới đây là a blog post sẽ trợ giúp với dấu tích thoát trong chuỗi.

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

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

SELECT 'test single quote' '' từ kép;

Đầu ra của tuyên bố trên sẽ là:

kiểm tra dấu nháy đơn'

Đơn giản chỉ cần nêu yêu cầu bạn ký tự đơn quote bổ sung cho in một quote> nhân vật duy nhất. Đó là nếu bạn đặt hai ký tự trích dẫn đơn, Oracle sẽ in một ký tự. Việc đầu tiên> một hành vi 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 đơn trong Oracle. Nhưng nó sẽ nhận được> 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 trường hợp này, phương thức sau hoạt động tốt. Nhưng nó đòi hỏi một số lao động đánh máy hơn.

-3

Chỉ cần đặt các tuyên bố sau đây trước khi CHO:

set escape '\'; 
+1

Tôi đã không -1, nhưng tôi không thể làm được điều này. – rjdkolb

2

Ngoài câu trả lời DCookie của trên, bạn cũng có thể sử dụng chr (39) cho một giá 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ó.

Dưới đây là một ví dụ rất đơn giản:

Select 'UPDATE Customers SET LName = ' || chr(39) || 'Doe' || chr(39) || ';' From dual;