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

답변:


184

리터럴 인용을 사용할 수 있습니다.

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

리터럴에 대한 문서는 여기에서 찾을 수 있습니다 .

또는 두 개의 따옴표를 사용하여 작은 따옴표를 나타낼 수 있습니다.

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

Q 구문을 사용하는 리터럴 인용 메커니즘은 더 유연하고 읽기 쉽습니다. IMO입니다.


19

다음 은 문자열에서 틱을 이스케이프하는 데 도움이 되는 블로그 게시물 입니다.

이 게시물에서 가장 간단한 방법은 다음과 같습니다.

가장 간단하고 가장 많이 사용되는 방법은 양쪽에 두 개의 작은> 따옴표가있는 작은 따옴표를 사용하는 것입니다.

이중에서 'test single quote' ''를 선택하십시오.

위 명령문의 출력은 다음과 같습니다.

작은 따옴표 테스트 '

작은 따옴표> 문자를 인쇄하려면 추가 작은 따옴표 문자가 필요하다고 간단히 말하면됩니다. 두 개의 작은 따옴표를 넣으면 Oracle이 하나를 인쇄합니다. 첫 번째> one은 이스케이프 문자처럼 작동합니다.

이것은 Oracle에서 작은 따옴표를 인쇄하는 가장 간단한 방법입니다. 그러나 인용 부호 한 개가 아닌 일련의 인용 부호를 인쇄해야 할 때> 복잡해질 것입니다. 이 상황에서는 다음 방법이 잘 작동합니다. 그러나 더 많은 타이핑 작업이 필요합니다.


13

위의 DCookie의 답변 외에도 작은 따옴표로 chr (39)를 사용할 수도 있습니다.

많은 양의 기존 데이터를 기반으로 여러 삽입 / 업데이트 문을 만들어야 할 때 특히 유용합니다.

다음은 매우 간단한 예입니다.

두 개의 열인 FirstName과 LastName이있는 매우 간단한 테이블 Customers가 있다고 가정 해 보겠습니다. 데이터를 Customers2로 이동해야하므로 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 IMMEDIATEDDL의 작동합니다 따옴표를 사용하지만, DDL의 매개 변수를 실행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.