ALTER FUNCTION [udf_DateTimeFromDataDtID]
(
@DATA_DT_ID int -- In form YYYYMMDD
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID))
END
Run Code Online (Sandbox Code Playgroud)
或者这个(因为字符串/日期文字 - 是的,我也试过'1900-01-01'):
ALTER FUNCTION udf_CappedDate
(
@DateTimeIn datetime
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
IF @DateTimeIn < '1/1/1900'
RETURN '1/1/1900'
ELSE IF @DateTimeIn > '1/1/2100'
RETURN '1/1/2100'
RETURN @DateTimeIn
END
Run Code Online (Sandbox Code Playgroud) sql sql-server sql-server-2005 deterministic user-defined-functions
情况:使用许多条件在C++或C#中进行条件检查:
if (condition1 && condition2 && condition3)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我一直认为不能保证执行这些检查的顺序.所以它不一定是条件1然后是条件2,而不是条件3.我在C++的时代学到了它.我想我被告知或在某处阅读.
直到知道我总是编写安全代码来解决在以下情况下可能的空指针:
if ((object != null) && (object.SomeFunc() != value))
{
// A bad way of checking (or so I thought)
}
Run Code Online (Sandbox Code Playgroud)
所以我在写:
if (object != null)
{
if (object.SomeFunc() != value)
{
// A much better and safer way
}
}
Run Code Online (Sandbox Code Playgroud)
因为我不确定首先运行非空检查,然后才会调用实例方法来执行第二次检查.
现在,我们最伟大的社区头脑告诉我,执行这些检查的顺序保证以从左到右的顺序运行.
我很惊讶.对C++和C#语言来说真的如此吗?
有没有人听过我之前听过的版本?
在C#中有什么方法可以将属性标记为确定性的吗?
我问的原因是我经常发现自己声明一个局部变量并将属性读入其中,而不是多次访问该属性.
有没有什么方法可以将属性装饰为确定性的,这样编译器就可以优化对该属性的多次访问?我猜测在这种情况下,类需要是不可变的,并且这样装饰.
这是甚至存在的东西还是我抓着稻草?
鉴于下表
create table tmp_test as
select mod(level, 5) as n
from dual
connect by level <= 10
;
Run Code Online (Sandbox Code Playgroud)
和这个功能
create or replace function test_deterministic (Pn in number
) return number deterministic is
begin
dbms_output.put_line(Pn);
dbms_lock.sleep(1);
return Pn;
end;
Run Code Online (Sandbox Code Playgroud)
它执行6次,耗时6秒:
SQL> select test_deterministic(n) from tmp_test;
TEST_DETERMINISTIC(N)
---------------------
1
2
3
4
0
1
2
3
4
0
10 rows selected.
1
2
3
4
0
1
Elapsed: 00:00:06.02
Run Code Online (Sandbox Code Playgroud)
我本来希望这次执行5次.如果我在SQL Developer或PL/SQL Developer中运行此SELECT语句,它只执行5次.同样,如果我在Pl/SQL中运行它,它会执行5次:
SQL> begin
2 for i in ( select test_deterministic(n) from …Run Code Online (Sandbox Code Playgroud) 在Prolog中编程时,我经常编写谓词,当所有参数被实例化时,其行为应该是半确定性的(否则其行为应该是非确定性的).
一个具体的用例就是我的谓词walk/3,它实现了图形遍历.由于两个顶点之间可以存在多条路径,因此实例化后(+,+)会给出多个选择点true.然而,这些都是无用的.once/1出于性能原因,必须明确使用调用代码.
%! walk(+Graph:ugraph, +StartVertex, +EndVertex) is semidet.
%! walk(+Graph:ugraph, -StartVertex, +EndVertex) is nondet.
%! walk(+Graph:ugraph, +StartVertex, -EndVertex) is nondet.
%! walk(+Graph:ugraph, -StartVertex, -EndVertex) is nondet.
Run Code Online (Sandbox Code Playgroud)
半决定论可以通过once/1在调用上下文中使用来强制,但我想将半决定论作为谓词的属性来实现walk/3,而不是每次被调用时都需要特别对待的东西.
除了对代码美学的关注之外,调用上下文不必总是知道它的调用是否walk/3是半确定性的.例如:
%! cycle(+Graph:ugraph, +Vertex) is semidet.
%! cycle(+Graph:ugraph, -Vertex) is nondet.
cycle(Graph, Vertex):-
walk(Graph, Vertex, Vertex).
Run Code Online (Sandbox Code Playgroud)
我提出了以下解决方案,它确实产生了正确的行为.
walk_wrapper(Graph, Start, End):-
call_ground_as_semidet(walk(Graph, Start, End)).
:- meta_predicate(call_ground_as_semidet(0)).
call_ground_as_semidet(Goal):-
ground(Goal), !,
Goal, !.
call_ground_as_semidet(Goal):-
Goal.
Run Code Online (Sandbox Code Playgroud)
但是,这种解决方案存在不足之处:
ground应该是nonvar …(这与在SQL服务器中建立日期相关.)
DATETIME是否存在确定性表达式?当我将其用作计算列公式时:
DATEADD(dd, DATEDIFF(dd, 0, [datetime_column]), 0)
Run Code Online (Sandbox Code Playgroud)
我在该列上放置索引时出错:
无法创建索引,因为键列'EffectiveDate'是非确定性的或不精确的.
但根据定义,DATEDIFF和DATEADD都是确定性函数.捕获量在哪里?可能吗?
我正在开发一个需要浮点确定性的C应用程序.我还希望浮点运算相当快.这包括IEEE754未指定的标准超越函数,如正弦和对数.与硬件浮点相比,我考虑的软件浮点实现相对较慢,所以我考虑简单地从每个答案中舍去一个或两个最低有效位.精度的损失对我的应用程序来说是一个充分的妥协,但这是否足以确保跨平台的确定性结果?所有浮点值都将是双倍的.
我意识到操作顺序是浮点结果差异的另一个潜在来源.我有办法解决这个问题.
如果今天使用的主要浮点硬件实现的软件实现将是非常好的,所以我可以直接测试这样的假设.
如果我从相同的值开始,并在双精度 64 位 IEEE 754-2008 值上执行相同的原始操作(加法、乘法、比较等),我会得到相同的结果,独立于底层机器吗?
更具体地说:由于ECMAScript 2015指定数字值是
对应于双精度 64 位二进制格式 IEEE 754-2008 值的原始值
我可以得出结论,相同的操作在这里产生相同的结果,独立于环境吗?
我创建了一个简单的确定性函数,并使用游标中的选择查询调用它,如下所示
CREATE TABLE TEMP
(dt DATE);
INSERT INTO TEMP
SELECT SYSDATE FROM DUAL CONNECT BY LEVEL<=3;
INSERT INTO TEMP
SELECT SYSDATE+1 FROM DUAL CONNECT BY LEVEL<=3;
COMMIT;
--2 distinct values
SELECT DISTINCT dt from TEMP;
Run Code Online (Sandbox Code Playgroud)
包装功能
CREATE OR REPLACE PACKAGE dummy_fun
AUTHID CURRENT_USER
IS
FUNCTION get_data(
p_date IN DATE)
RETURN DATE
DETERMINISTIC;
END dummy_fun;
/
CREATE OR REPLACE PACKAGE BODY dummy_fun
IS
FUNCTION get_data(
p_date IN DATE)
RETURN DATE
DETERMINISTIC
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('get_data with input (p_date=>'||p_date||' called)');
RETURN p_date+1;
END …Run Code Online (Sandbox Code Playgroud) 假设我有一个(可能很大)的浮点数向量,这些向量是由一些黑盒过程产生的。是否可以计算这些数字的按位可重现的总和?
如果黑盒过程总是以相同的顺序生成数字,那么按位可重现的求和很容易:只需从左到右求和即可。
但是,如果数字以随机顺序生成,也许是因为它们是从异步进程返回和收集的,那么就更难了:我必须对它们进行数字排序。
但是,如果有更多的数字,可能分布在不同的机器上,因此移动它们是不可取的怎么办?
还有一种方法可以确定地对它们求和吗?
deterministic ×10
sql ×3
c# ×2
oracle ×2
sql-server ×2
algorithm ×1
c ×1
c++ ×1
coding-style ×1
function ×1
ieee-754 ×1
indexing ×1
javascript ×1
math ×1
oracle12c ×1
plsql ×1
prolog ×1
properties ×1
rounding ×1
sqlplus ×1