Oar-00933:Comando SQL não correctamente terminado
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?
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;"
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.