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.

Foi útil?

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') )

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top