sysdate和current_date的oracle文档声称它们都返回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
答案 0 :(得分:1)
1)CURRENT_DATE返回会话时区的当前日期。你真的需要current_date吗? 如果没有,请坚持使用sysdate。那将是你的程序
2)如果您仍然需要CURRENT_DATE,以下是解决方案。将current_date的值存储到变量中,它将解决您的问题。如果这回答了你的问题,请跟我说。
drop table test;
create table test(x date);
create or replace procedure test1 authid definer
is
dateVar date;
cursor s is select x from test where dateVar > x;
begin
dateVar:=current_date;
for x in s loop null;
end loop;
end;
/
SQL> show errors
No errors.