Ayuda con ORA-00933: comando sql ni finalizado correctamente
Pregunta
Si ejecuto el siguiente SQL usando el desarrollador SQL de Oracle.
select payee_id, to_char(check_date,'d') as DOW,
(cmcl_bank_cleared - check_date) as DateDiff from AP_Master
where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=1)
order by payee_address_zip, DOW, DateDiff
Funciona bien, sin embargo, cuando intento hacerlo usando Delphi
SQL.Add('select payee_id, to_char(check_date, ' + QuotedStr('d') + ') as DOW, ');
SQL.Add('(cmcl_bank_cleared - check_date) as DateDiff from AP_Master ');
SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam))');
SQL.Add('order by payee_id, DOW, DateDiff;');
Recibo el mensaje de error "ORA-00933: SQL Ni NOR finalizado correctamente"
Solución
Mira el doble soporte después de los paramáticos. No lo tienes en tu desarrollador SQL SQL. Para evitar que use StackOverflow como un corrector ortográfico Oracle SQL, podría:
- Use el editor SQL y pegue el texto de la consulta allí
- Use una constante de cadena y asigna en un todo, en lugar de línea por línea
Otros consejos
¿Por qué insistes en hacer esto de la manera difícil? :)
const
SQLText = 'select payee_id, to_char(check_date, ''d'') as DOW,'#13 +
'(cmcl_bank_cleared - check_date) as DateDiff from AP_Master'#13 +
'where (cmcl_bank_cleared is not null)'#13 +
'AND (cmcl_bank_cleared - check_date >=:DaysParam)'#13 +
'order by payee_id, DOW, DateDiff'#13;
begin
MyQuery.SQL.Text := SQLText;
MyQuery.ParamByName('DaysParam').AsInteger := SomeNumberOfDays;
try
MyQuery.Open;
// Use query results
finally
MyQuery.Free;
end;
end;
Tengo una utilidad que le permitirá seleccionar esto en el IDE y copiarlo en el portapapeles, ejecutar la utilidad y luego pegar directamente en su ventana de consulta de desarrollador SQL (o cualquier otro control de edición). También tengo uno que hace el reverso: selecciona cualquier texto de consulta en el portapapeles, ejecuta la utilidad y luego pegue el código después del const Whatever =
Para hacer una constante de cadena Delphi perfectamente formada para usar como se indicó anteriormente (de hecho, lo usé después de limpiar sus declaraciones SQL.Add para asegurarse de que las citas incrustadas fueran correctas).
¿Qué componentes estás usando en Delphi para tu consulta?
Tiene un semi-colon al final de su cadena de cláusula por pedido que causará este error, dependiendo de los componentes que esté utilizando para la consulta.