Como inserir uma string que contém um “&”
Pergunta
Como posso escrever uma instrução de inserção que inclui o & personagem? Por exemplo, se eu quisesse inserir "J & J Construção" em uma coluna no banco de dados.
Eu não tenho certeza se ele faz a diferença, mas eu estou usando o Oracle 9i.
Solução
Eu continuo esquecendo isso e voltar a ele novamente! Acho que a melhor resposta é uma combinação das respostas dadas até agora.
Em primeiro lugar, e é a variável de prefixo em sqlplus / sqldeveloper, daí o problema -. Quando ele aparece, é esperado para ser parte de um nome de variável
SET DEFINE OFF irá parar sqlplus interpretar e desta forma.
Mas e se você precisa variáveis ??uso sqlplus e literais e caracteres?
- Você precisa de definir DEFINE a fazer variáveis ??de trabalho
- E SET ESCAPE ON escapar usos de &.
por exemplo.
set define on
set escape on
define myvar=/forth
select 'back\\ \& &myvar' as swing from dual;
Produz:
old 1: select 'back\\ \& &myvar' from dual
new 1: select 'back\ & /forth' from dual
SWING
--------------
back\ & /forth
Se você quiser usar um caractere de escape diferente:
set define on
set escape '#'
define myvar=/forth
select 'back\ #& &myvar' as swing from dual;
Quando você definir um caractere de escape específico, você pode ver 'SP2-0272: caractere de escape não pode ser alfanumérico ou espaço em branco'. Isso provavelmente significa que você já tem o caractere de escape definido, e as coisas ficam terrivelmente auto-referencial. A maneira limpa de evitar este problema é definir escapar off primeira:
set escape off
set escape '#'
Outras dicas
Se você está fazendo isso do uso SQLPLUS
SET DEFINE OFF
para pará-lo pisando e como um caso especial
Uma solução alternativa, o uso de concatenação e a função chr:
select 'J' || chr(38) || 'J Construction' from dual;
A sintaxe correta é
set def off;
insert into tablename values( 'J&J');
Há sempre a função chr (), que converte um código ASCII para string.
ie. algo como: INSIRA DENTRO DE tabela VALUES ( CONCAT ( 'J', CHR (38), 'J') )
SET SCAN OFF é obsoleto http://download-uk.oracle. com / docs / cd / B10501_01 / server.920 / a90842 / apc.htm
Em um programa, use sempre uma consulta parametrizada. Ele evita ataques de injeção SQL, bem como quaisquer outros caracteres que são especiais para o analisador SQL.
Descobri que usando uma das seguintes opções funciona:
SET DEF OFF
ou
SET SCAN OFF
Eu não sei o suficiente sobre bancos de dados para saber se um é melhor ou "mais certo" do que o outro. Além disso, se há algo melhor do que qualquer um destes, por favor me avise.
Você pode inserir uma string como 'J' || 'e' || 'Construção' . Ele funciona muito bem.
insert into table_name (col_name) values('J'||'&'||'Construction');
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
saída deste consulta: de Jonhy Esporte e Fitness
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;
(não testado, não tem uma caixa da Oracle na mão e tem sido um tempo)
Se você estiver usando SQL Plus, então eu acho que você precisa para emitir o comando
SET SCAN OFF
Pare de usar SQL / Plus, eu recomendo PL / SQL Developer é muito mais do que um SQL ferramenta.
P.S. Algumas pessoas preferem SAPO .
Olha, Andrew:
"J & J Construção" :
SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;