oracle - sysdate 和 current_date 有不同的类型?

标签 oracle

sysdate 和 current_date 的 oracle 文档声称它们都返回 DATE:

  • sysdate
  • current_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
    

    最佳答案

    1) CURRENT_DATE 返回 session 时区中的当前日期。你真的需要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.
    

    关于oracle - sysdate 和 current_date 有不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31303776/

    相关文章:

    oracle - PL/SQL : Update row based on ROWID

    oracle - 用mybatis 3调用pl/sql函数

    sql - 查询输出表中不存在的值

    java.sql.SQLException : Exhausted Resultset

    java - Oracle:Java 存储函数:使用数据库

    sql - 是否存在不适用于 R 的 SQL 数据类型?

    oracle - 带有 Entity Framework 的 Oracle Unmanaged Provider 的 Nuget 包

    oracle - 将转储文件导入 oracle 11gr2 出现错误

    mysql - 将相交从 Oracle 转换为 MySQL

    sql - 向查询结果中添加 "empty"行