首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sysdate差异

sysdate差异
EN

Stack Overflow用户
提问于 2011-10-31 21:39:54
回答 2查看 2.7K关注 0票数 8

有这样的呼声

代码语言:javascript
复制
some_proc(sysdate, sysdate);
select some_func(sysdate, sysdate) from dual

我想知道是否有可能两个sysdate调用会给出不同的值?sysdate不是仅仅因为执行速度而改变吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-01 14:40:02

some_proc(sysdate, sysdate); -在PL/SQL语句中使用时,sysdate并不总是相同的

SQL -在SQL语句中使用sysdate时始终相同(即使该SQL语句调用PL/SQL)

从概念指南的Statement-Level Read Consistency部分中可以看到:"Oracle始终强制语句级读取一致性。这保证了单个查询返回的所有数据都来自单个时间点,即查询开始的时间。“

这个页面有点暗示了纯PL/SQL函数不是这样的。

我们可以通过创建一个接受许多时间戳参数的大型函数(SQL上下文)和过程(PL/SQL上下文)来演示这一点,然后比较输入参数是否有任何差异。我使用时间戳而不是日期,因为它们在一致性方面应该以相同的方式工作,但是时间戳(9)更改的可能性是日期的十亿倍。(大概--可能有很多我不知道的舍入和内部时钟细节,这使得事情变得更加复杂。)

代码语言:javascript
复制
--First, use functions like these to create long strings of variables.
--PL/SQL can go to 64K parameters, but luckily differences appear much sooner.

--Parameters for function and procedure
select listagg('a'||level||' timestamp', ',') within group(order by level)
from dual connect by level <= 100 order by level;

--Columns for least/greatest
select listagg('a'||level, ',') within group(order by level)
from dual connect by level <= 100;

--Systimestamps for select/exec
select listagg('systimestamp',',') within group(order by 1)
from dual connect by level <= 100;




--FUNCTION - SQL context
create or replace function function_test(
    a1 timestamp,a2 timestamp,a3 timestamp,a4 timestamp,a5 timestamp,a6 timestamp,a7 timestamp,a8 timestamp,a9 timestamp,a10 timestamp,a11 timestamp,a12 timestamp,a13 timestamp,a14 timestamp,a15 timestamp,a16 timestamp,a17 timestamp,a18 timestamp,a19 timestamp,a20 timestamp,a21 timestamp,a22 timestamp,a23 timestamp,a24 timestamp,a25 timestamp,a26 timestamp,a27 timestamp,a28 timestamp,a29 timestamp,a30 timestamp,a31 timestamp,a32 timestamp,a33 timestamp,a34 timestamp,a35 timestamp,a36 timestamp,a37 timestamp,a38 timestamp,a39 timestamp,a40 timestamp,a41 timestamp,a42 timestamp,a43 timestamp,a44 timestamp,a45 timestamp,a46 timestamp,a47 timestamp,a48 timestamp,a49 timestamp,a50 timestamp,a51 timestamp,a52 timestamp,a53 timestamp,a54 timestamp,a55 timestamp,a56 timestamp,a57 timestamp,a58 timestamp,a59 timestamp,a60 timestamp,a61 timestamp,a62 timestamp,a63 timestamp,a64 timestamp,a65 timestamp,a66 timestamp,a67 timestamp,a68 timestamp,a69 timestamp,a70 timestamp,a71 timestamp,a72 timestamp,a73 timestamp,a74 timestamp,a75 timestamp,a76 timestamp,a77 timestamp,a78 timestamp,a79 timestamp,a80 timestamp,a81 timestamp,a82 timestamp,a83 timestamp,a84 timestamp,a85 timestamp,a86 timestamp,a87 timestamp,a88 timestamp,a89 timestamp,a90 timestamp,a91 timestamp,a92 timestamp,a93 timestamp,a94 timestamp,a95 timestamp,a96 timestamp,a97 timestamp,a98 timestamp,a99 timestamp,a100 timestamp
) return varchar2 is
    v_min timestamp(9);
    v_max timestamp(9);
begin
    v_min := least(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100
        );
    v_max := greatest(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100
        );
    if v_min <> v_max then
        return 'different';
    else
        return 'the same';
    end if;
end;
/

--No matter how many times you run this, you'll always get "the same".
select function_test(systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp)
from dual;




--PROCEDURE - PL/SQL context
set serveroutput on;

create or replace procedure procedure_test(
        a1 timestamp,a2 timestamp,a3 timestamp,a4 timestamp,a5 timestamp,a6 timestamp,a7 timestamp,a8 timestamp,a9 timestamp,a10 timestamp,a11 timestamp,a12 timestamp,a13 timestamp,a14 timestamp,a15 timestamp,a16 timestamp,a17 timestamp,a18 timestamp,a19 timestamp,a20 timestamp,a21 timestamp,a22 timestamp,a23 timestamp,a24 timestamp,a25 timestamp,a26 timestamp,a27 timestamp,a28 timestamp,a29 timestamp,a30 timestamp,a31 timestamp,a32 timestamp,a33 timestamp,a34 timestamp,a35 timestamp,a36 timestamp,a37 timestamp,a38 timestamp,a39 timestamp,a40 timestamp,a41 timestamp,a42 timestamp,a43 timestamp,a44 timestamp,a45 timestamp,a46 timestamp,a47 timestamp,a48 timestamp,a49 timestamp,a50 timestamp,a51 timestamp,a52 timestamp,a53 timestamp,a54 timestamp,a55 timestamp,a56 timestamp,a57 timestamp,a58 timestamp,a59 timestamp,a60 timestamp,a61 timestamp,a62 timestamp,a63 timestamp,a64 timestamp,a65 timestamp,a66 timestamp,a67 timestamp,a68 timestamp,a69 timestamp,a70 timestamp,a71 timestamp,a72 timestamp,a73 timestamp,a74 timestamp,a75 timestamp,a76 timestamp,a77 timestamp,a78 timestamp,a79 timestamp,a80 timestamp,a81 timestamp,a82 timestamp,a83 timestamp,a84 timestamp,a85 timestamp,a86 timestamp,a87 timestamp,a88 timestamp,a89 timestamp,a90 timestamp,a91 timestamp,a92 timestamp,a93 timestamp,a94 timestamp,a95 timestamp,a96 timestamp,a97 timestamp,a98 timestamp,a99 timestamp,a100 timestamp
) is
    v_min timestamp(9);
    v_max timestamp(9);
begin
    v_min := least(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100
        );
    v_max := greatest(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100
        );
    if v_min <> v_max then
        dbms_output.put_line('different');
    else
        dbms_output.put_line('the same');
    end if;
end;
/

--I see "different" about 50% of the time.
--The ratio of differences decreases as you decrease the number of parameters. 

exec procedure_test(systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp,systimestamp);
票数 11
EN

Stack Overflow用户

发布于 2011-10-31 22:08:33

在分析语句然后执行语句时,Oracle将使用SYSDATE的所有实例的当前系统日期和时间。执行速度不是一个因素,因为值替换发生在执行之前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7954509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档