Документы оракула для sysdate и current_date утверждают, что они оба возвращают DATE:
Однако этот тест:
alter session set plsql_warnings = 'ENABLE:ALL';
create table test(x date);
create or replace procedure test1 authid definer is
cursor s is select x from test where current_date > x;
begin for x in s loop null; end loop; end;
/
show errors
drop table test;
drop procedure test1;
производит этот вывод:
Errors for PROCEDURE TEST1:
LINE/COL ERROR
3/42 PLW-07204: conversion away from column type may result in sub-optimal query plan
Использование sysdate не дает такого же предупреждения. Я подозреваю, что замена current_date на sysdate в запросах может привести к изменению плана запроса, особенно если столбцы даты проиндексированы.
редактировать:
select dump(current_date) from dual;
select dump(sysdate) from dual;
дает:
DUMP(CURRENT_DATE)
Typ=13 Len=8: 223,7,7,9,11,23,55,0
DUMP(SYSDATE)
Typ=13 Len=8: 223,7,7,9,11,23,55,0
DUMP(CURRENT_DATE)
Typ=13 Len=8: 223,7,7,9,11,11,57,0
DUMP(SYSDATE)
Typ=13 Len=8: 223,7,7,9,11,11,57,0
- person Alistair Bayley   schedule 09.07.2015select distinct version from product_component_version
дает11.2.0.2.0
- person Alistair Bayley   schedule 09.07.2015to_date()
. Только sysdate обрабатывается по-разному, что может быть связано с ошибки 9714892, 8760135 и т. д. Трудно сказать, является ли это ложным предупреждением - если выборка неверна, это может повлиять на план, я полагаю (см. также план; только sysdate имеет обозначение @!, как вfilter("X"<SYSDATE@!)
). не думаю, что дело именно в типах, а в специальной обработке для sysdate? - person Alex Poole   schedule 09.07.2015