PL / SQL, como escapar das aspas simples em uma string?

114

No Oracle PL / SQL, como escapar das aspas simples em uma string? Tentei assim, não deu certo.

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;
/
user595234
fonte
possível duplicata de aspas simples de escape em PLSQL
Doc Brown

Respostas:

184

Você pode usar citação literal:

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

A documentação para literais pode ser encontrada aqui .

Como alternativa, você pode usar duas aspas para denotar uma aspa simples:

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

O mecanismo de cotação literal com a sintaxe Q é mais flexível e legível, IMO.

DCookie
fonte
19

Aqui está uma postagem de blog que deve ajudar a escapar de ticks em strings.

Este é o método mais simples dessa postagem:

A forma mais simples e mais utilizada é usar aspas simples com duas> aspas simples em ambos os lados.

SELECT 'testar aspas simples' '' de duplo;

O resultado da declaração acima seria:

testar aspas simples '

Simplesmente afirmando que você precisa de um caractere de aspas simples adicional para imprimir um caractere de aspas simples. Isto é, se você colocar dois caracteres de aspas simples, o Oracle imprimirá um. O primeiro> atua como um personagem de escape.

Essa é a maneira mais simples de imprimir aspas simples no Oracle. Mas ficará> complexo quando você precisar imprimir um conjunto de aspas em vez de apenas uma. Nesta> situação, o método a seguir funciona bem. Mas requer um pouco mais de trabalho de digitação.

cboler
fonte
13

Além da resposta do DCookie acima, você também pode usar chr (39) para uma aspa simples.

Acho isso particularmente útil quando preciso criar várias instruções de inserção / atualização com base em uma grande quantidade de dados existentes.

Aqui está um exemplo muito rápido:

Digamos que temos uma tabela muito simples, Clientes, que possui 2 colunas, Nome e Sobrenome. Precisamos mover os dados para Clientes2, então precisamos gerar um monte de instruções INSERT.

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

Descobri que isso é muito útil ao mover dados de um ambiente para outro ou ao reconstruir um ambiente rapidamente.

Corwin01
fonte
0

EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')'; trabalhou para mim. fechar o varchar/ stringcom dois pares de aspas simples funcionou. Outra opção pode ser usar a usingpalavra-chave EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002'; Lembre-se de que a usingpalavra-chave não funcionará, se você estiver usando EXECUTE IMMEDIATEpara executar DDLs com parâmetros, no entanto, usar aspas funcionará para DDLs.

Shravan Ramamurthy
fonte