"&"가 포함 된 문자열을 삽입하는 방법
문제
& 문자를 포함하는 삽입 문을 어떻게 작성할 수 있습니까? 예를 들어, "J & J Construction"을 데이터베이스의 열에 삽입하려는 경우.
그것이 차이가 있는지 확실하지 않지만 Oracle 9i를 사용하고 있습니다.
해결책
나는 이것을 계속 잊어 버리고 다시 돌아온다! 최선의 대답은 지금까지 제공된 응답의 조합이라고 생각합니다.
첫째, & & sqlplus/sqldeveloper의 변수 접두사입니다. 따라서 문제가 나타나면 변수 이름의 일부가 될 것으로 예상됩니다.
SET DEFINE OFF는 SQLPLUS 해석 및이 방법을 중지합니다.
그러나 sqlplus 변수를 사용해야한다면 어떨까요? 그리고 리터럴 & 캐릭터?
- 변수가 작동하도록 설정 정의가 필요합니다
- 그리고 &의 탈출로 탈출하십시오.
예를 들어
set define on
set escape on
define myvar=/forth
select 'back\\ \& &myvar' as swing from dual;
생산 :
old 1: select 'back\\ \& &myvar' from dual
new 1: select 'back\ & /forth' from dual
SWING
--------------
back\ & /forth
다른 탈출 문자를 사용하려면 :
set define on
set escape '#'
define myvar=/forth
select 'back\ #& &myvar' as swing from dual;
특정 탈출 문자를 설정하면 'SP2-0272 : 탈출 문자가 영숫자 또는 공백이 될 수 없습니다'가 표시 될 수 있습니다. 이것은 아마도 당신이 이미 탈출 캐릭터를 정의했으며 상황이 끔찍하게 자기 참조되는 것을 의미합니다. 이 문제를 피하는 깨끗한 방법은 먼저 탈출을 설정하는 것입니다.
set escape off
set escape '#'
다른 팁
SQLPLUS 사용에서 수행하는 경우
SET DEFINE OFF
트레딩을 중단하고 특별한 경우
대체 솔루션, 연결 및 CHR 기능을 사용하십시오.
select 'J' || chr(38) || 'J Construction' from dual;
올바른 구문은입니다
set def off;
insert into tablename values( 'J&J');
ASCII 코드를 문자열로 변환하는 chr () 함수는 항상 있습니다.
즉. 같은 것 : 테이블 값에 삽입 (COCAT ( 'j', chr (38), 'j'))
SET SCAN OFF는 쓸모가 없습니다http://download-uk.oracle.com/docs/cd/b10501_01/server.920/a90842/apc.htm
프로그램에서 항상 매개 변수화 쿼리를 사용하십시오. SQL 주입 공격뿐만 아니라 SQL 파서에게 특별한 다른 문자를 피합니다.
다음 옵션 중 하나를 사용하는 것이 좋습니다.
SET DEF OFF
또는
SET SCAN OFF
데이터베이스에 대해 하나가 다른 것보다 더 낫거나 "더 옳다"는 것을 알기에 충분히 알지 못합니다. 또한이 중 하나보다 더 좋은 것이 있다면 알려주십시오.
그러한 문자열을 삽입 할 수 있습니다 'J'|| '&'|| '건축'. 잘 작동합니다.
insert into table_name (col_name) values('J'||'&'||'Construction');
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
이 쿼리의 출력 : Jonhy 's Sport & Fitness
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;
(테스트되지 않은 것은 오라클 상자가없고 오랜 시간이 지났습니다)
SQL Plus를 사용하는 경우 명령을 발행해야한다고 생각합니다.
SET SCAN OFF
SQL/Plus 사용을 중단하면 적극 권장합니다 PL/SQL 개발자 SQL 도구 이상입니다.
추신 일부 사람들은 선호합니다 두꺼비.
앤드류 :
"J & J Construction":
SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;