Pergunta

Eu estou usando o provedor ole db para ADO.Net conexão a um banco de dados Oracle.No meu loop, eu estou fazendo um insert:

insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)

A primeira inserção bem-sucedida, mas o segundo dá um erro:

ORA-00933: SQL command not properly ended

O que estou fazendo de errado?

Foi útil?

Solução

Para mim parece que está faltando um ; entre as duas declarações:
insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)
;
insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)
;
Tente adicionar o ; e deixe-nos saber.

Outras dicas

Em .net, quando tentamos executar um único Oracle instrução de SQL com um ponto-e-vírgula no final.O resultado será um erro oracle:ora-00911:de caracteres inválidos.OK, você descobrir que uma instrução de SQL não precisa de ponto e vírgula, mas o que sobre a execução de 2 instrução de SQL em uma cadeia de caracteres, por exemplo:

Dim db As Database = DatabaseFactory.CreateDatabase("db")
Dim cmd As System.Data.Common.DbCommand
Dim sql As String = ""

sql = "DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; "

cmd = db.GetSqlStringCommand(sql)
db.ExecuteNonQuery(cmd)

O código acima vai dar o mesmo erro Oracle:ora-00911:de caracteres inválidos.

A solução para este problema é para embrulhar o 2 Oracle instruções de SQL com um BEGIN e END; a sintaxe, por exemplo:

sql = "BEGIN DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; END;"

Cortesia: http://www.lazyasscoder.com/Article.aspx?id=89&title=ora-00911%3A+invalid+character+when+executing+multiple+Oracle+SQL+statements

No Oracle, o ponto-e-vírgula ';' é usado apenas em sqlplus.Quando você estiver usando o ODBC/JDBC, OLEDB, etc, você não coloque um ponto-e-vírgula no final de sua declaração.No caso acima, você está, na verdade, executar 2 instruções diferentes, de modo a melhor maneira de lidar com o problema é usar 2 declarações em vez de tentar combinar em uma única instrução, pois você não pode usar o ponto-e-vírgula.

ponto e vírgula após o primeiro a inserir?

Oracle SQL usa ponto-e-vírgula ;no fim da instrução do marcador.

você precisará adicionar o ;depois de incomodar inserir statments.

NB:que também assume ADODB permitirá 2 insere em uma única chamada.

a alternativa poderia ser a de dispor ambas as chamadas em um bloco,

BEGIN
      insert (...) into (...);
      insert (...) into (...);
END;

No meu ciclo eu não estava re-inicializar o meu StringBuilder ...assim, a vários instrução insert que eu postei.

Obrigado por sua ajuda de qualquer maneira!!

É um tiro no escuro, mas no primeiro insira o sql formato de data é válida para ambos-reino unido/eua, inserir o segundo é inválida se o banco de dados Oracle é o programa de configuração para o reino UNIDO formato de data, eu sei que você tem usado a função TO_DATE, mas eu não vejo mais nada ...

É o ponto-e-vírgula necessário a partir de OLE_DB ?Não precisava de mais da API ?

O ADO.NET fornecedor de OLE DB para dados genéricos de acesso, onde você não tem um fornecedor específico para o seu banco de dados.Use OracleConnection et al preferência a OleDbConnection para uma conexão de banco de dados Oracle.

Além do ponto-e-vírgula problema, eu recomendo fortemente que você olhar para ligar variáveis.Falhando para usá-los pode causar banco de dados de problemas de desempenho na estrada.O código também tende a ser mais limpo.

O problema pode ser que você tenha um parâmetro variável é null sendo inserido na consulta.Que foi o que o meu problema.Uma vez eu dei o parâmetro um valor padrão de seqüência de caracteres vazia, funcionou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top