2008-09-30 31 views
34

Làm cách nào để viết một câu lệnh chèn bao gồm ký tự &? Ví dụ: nếu tôi muốn chèn "J & J Construction" vào một cột trong cơ sở dữ liệu.Cách chèn một chuỗi có chứa "&"

Tôi không chắc liệu nó có tạo sự khác biệt hay không, nhưng tôi đang sử dụng Oracle 9i.

Trả lời

53

Tôi tiếp tục quên điều này và quay lại với nó một lần nữa! Tôi nghĩ câu trả lời tốt nhất là sự kết hợp của các phản hồi được cung cấp cho đến nay.

Thứ nhất, & là tiền tố biến trong sqlplus/sqldeveloper, do đó vấn đề - khi nó xuất hiện, nó được cho là một phần của tên biến.

SET DEFINE OFF sẽ ngừng sqlplus giải thích & theo cách này.

Nhưng nếu bạn cần sử dụng biến sqlplus chữ & ký tự?

  • Bạn cần SET DEFINE ON để làm biến làm việc
  • Và SET ESCAPE ON để thoát khỏi công dụng của &.

ví dụ:

set define on 
set escape on 

define myvar=/forth 

select 'back\\ \& &myvar' as swing from dual; 

Tạo:

old 1: select 'back\\ \& &myvar' from dual 
new 1: select 'back\ & /forth' from dual 

SWING 
-------------- 
back\ & /forth 

Nếu bạn muốn sử dụng một ký tự thoát khác nhau:

set define on 
set escape '#' 

define myvar=/forth 

select 'back\ #& &myvar' as swing from dual; 

Khi bạn thiết lập một nhân vật thoát cụ thể, bạn có thể thấy 'SP2-0272: thoát ký tự không thể là chữ và số hoặc khoảng trống '. Điều này có thể có nghĩa là bạn đã có nhân vật trốn thoát được định nghĩa, và mọi thứ trở nên tự tham khảo khủng khiếp. Cách làm sạch để tránh vấn đề này là để thiết lập thoát khỏi đầu tiên:

set escape off 
set escape '#' 
+0

np! như tôi đã nói, tôi tiếp tục quên điều này, rất vui khi có cơ hội ghi lại 'câu trả lời toàn diện' ;-) – tardate

+0

Câu hỏi thường gặp về SQL * này (http://www.orafaq.com/wiki/SQL*Plus_FAQ# How_does_one_disable_interactive_prompting_in_SQL.2APlus.3F) cung cấp câu trả lời tương tự. – DavidRR

0

Nếu bạn đang sử dụng sql cộng sau đó tôi nghĩ rằng bạn cần phải thực hiện lệnh

SET SCAN OFF 
16

Nếu bạn đang làm việc đó từ sqlplus sử dụng

SET DEFINE OFF 

để ngăn chặn nó giẫm chân & như một đặc biệt trường hợp

+3

trình trong SQL Developer cũng –

1
SET ESCAPE ON; 
INSERT VALUES("J\&J Construction") INTO custnames; 

(Chưa được kiểm tra, không có hộp Oracle sẵn có và nó có được một lúc)

+1

Sau đó, bạn sẽ phải có một điều trị đặc biệt để xác định một dấu gạch chéo. –

2

tôi đã tìm thấy rằng việc sử dụng một trong các tùy chọn sau hoạt động:

SET DEF OFF

hoặc

SET SCAN OFF

Tôi không biết đủ về cơ sở dữ liệu để biết nếu cái nào tốt hơn hay "đúng hơn" cái kia. Ngoài ra, nếu có một cái gì đó tốt hơn một trong số này, xin vui lòng cho tôi biết.

4

Trong một chương trình, luôn luôn sử dụng một truy vấn tham số. Nó tránh các cuộc tấn công SQL Injection cũng như các ký tự khác đặc biệt đối với trình phân tích cú pháp SQL.

5

Cú pháp đúng là

set def off; 
insert into tablename values('J&J'); 
0

Dừng sử dụng SQL/Thêm vào đó, tôi khuyên bạn nên PL/SQL Developer nó nhiều hơn một công cụ SQL.

p.s. Một số người thích TOAD.

+0

nếu bạn cần làm việc trên hộp Unix/Linux !!! :) – Neels

5

Luôn luôn có những chr() chức năng, trong đó chuyển đổi một mã ascii để chuỗi.

tức là. cái gì đó như: INSERT INTO bảng GIÁ TRỊ ( CONCAT ('J', CHR (38), 'J') )

7

Một giải pháp thay thế, sử dụng nối và chức năng chr:

select 'J' || chr(38) || 'J Construction' from dual; 
+0

Bạn đang thiếu || sau chr (38) –

2

Bạn có thể chèn một chuỗi như 'J' || ' & '||' Xây dựng '. Nó hoạt động tốt.

insert into table_name (col_name) values('J'||'&'||'Construction'); 
0

Look, Andrew:

"J & J Xây dựng":

CHỌN CONCAT ('J', CONCAT (CHR (38), 'J Xây dựng')) FROM DUAL ;

0
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness') 

đầu ra của truy vấn này: Jonhy của Sport & Thể

Các vấn đề liên quan