SELECT COUNT (*)
FROM rps2_workflow
WHERE workflow_added > TO_DATE ('01.09.2011', 'dd.mm.yyyy')
AND workflow_finished < TO_DATE ('wtf', 'dd.mm.yyyy')
AND workflow_status IN (7, 12, 17)
AND workflow_worker = 159
espero que esta consulta a fallar, debido fecha no válida, pero devuelve 0éxito inesperado consulta
El plan para esta consulta muestra que el 8 de paso de la cláusula inválida es procesados:
8 TABLE ACCESS BY INDEX ROWID TABLE RPS2.RPS2_WORKFLOW Object Instance: 1 Filter Predicates: ("WORKFLOW_STATUS"=7 OR "WORKFLOW_STATUS"=12 OR "WORKFLOW_STATUS"=17) AND SYS_EXTRACT_UTC("WORKFLOW_FINISHED")<SYS_EXTRACT_UTC(TO_DATE('wtf','dd.mm.yyyy')) Cost: 11 Bytes: 33 Cardinality: 1 CPU Cost: 8 M IO Cost: 10 Time: 1
Si nos comente AND workflow_status IN (7, 12, 17)
estado - como era de esperar entonces que obtenemos ORA-01858: a non-numeric character was found where a numeric was expected
Si se comentan a cabo AND workflow_finished < TO_DATE ('wtf', 'dd.mm.yyyy')
entonces obtenemos cantidad de registros que se ajustan a esas condiciones (> 0)
¿Cómo es esto posible?
UPD:
La sugerencia /*+no_index(rps2_workflow) */
no cambia nada (mientras que en el plan se ve que se lleva a cabo FullScan)
SELECT STATEMENT ALL_ROWSCost: 254 Bytes: 31 Cardinality: 1 CPU Cost: 34 M IO Cost: 248 Time: 4
2 SORT AGGREGATE Bytes: 31 Cardinality: 1
1 TABLE ACCESS FULL TABLE RPS2.RPS2_WORKFLOW Object Instance: 1 Filter Predicates: "WORKFLOW_WORKER"=159 AND ("WORKFLOW_STATUS"=7 OR "WORKFLOW_STATUS"=12 OR "WORKFLOW_STATUS"=17) AND SYS_EXTRACT_UTC("WORKFLOW_ADDED")>SYS_EXTRACT_UTC(TIMESTAMP' 2011-09-01 00:00:00') AND SYS_EXTRACT_UTC("WORKFLOW_FINISHED")<SYS_EXTRACT_UTC(TO_DATE('wtf','dd.mm.yyyy')) Cost: 254 Bytes: 31 Cardinality: 1 CPU Cost: 34 M IO Cost: 248 Time: 4
@BoltClock: aw, no se puede poner sql al final de la lista de etiquetas: -S El problema es específico de Oracle, no solo una pregunta general de sql – zerkms
Supongo que el optimizador no encontró registros (usando índices) para el trabajador 159 con un estado de 7, 12 o 17, por lo que no se molestó en evaluar el resto de la consulta. Cuando elimina la comprobación de estado, se encuentran algunos registros, por lo que debe evaluar la función TO_DATE y provocar el error. Es difícil decir con certeza qué está haciendo el optimizador de consultas ... – Sparky
@Sparky: mire el último párrafo, si eliminamos la consulta "incorrecta", devuelve las filas. También lo pensé en un momento, pero ** hay ** registros con estados especificados – zerkms