为什么调用CURRENT_DATE
,CURRENT_TIMESTAMP
,SYSDATE
和SYSTIMESTAMP
时没有括号。我知道它们不带参数,但是在其他语言中,您仍然可以使用括号来调用函数。在Oracle中,任何永不接受参数的函数都不能用括号调用吗?
如果有人可以指出我的文档,我将不胜感激。
答案 0 :(得分:5)
Oracle在许多方面都很奇怪。它在许多方面起着快速而松散的作用:NULL
的含义,隐式数据类型转换以及大量其他事情。
正如您所注意到的,在它们中间是调用没有参数的函数的语法不一致。 (对于声明这样的功能,也请参见下文。)
sysdate
和current_timestamp
之类的本机函数,不带参数,必须,不能带括号。您要求提供文档...最直接(但也不完全令人满意)的指针指向每个函数的文档,语法非常清晰地显示在没有括号内。您在寻找什么-文档中有单独提及,他们在其中明确说明了这一点?
例如,将其与诸如rownumber()
之类的解析函数进行比较,该函数也不接受参数。您必须用用空括号括起来!
更糟:对于函数,您可以在PL / SQL中编写自己,然后从SQL语句调用:如果函数不带参数,则必须在没有括号的情况下对其进行定义。但是,当您调用它时(例如,在select
语句中),您可以使用 或 不使用它(空)括号-两种语法均有效。遗憾的是,具有本机函数,例如sysdate
。为什么?再次,问Oracle是个好问题。
它也不止于此。 connect_by_root
是“分层功能”(可以在分层查询中使用的功能)。它带有一个参数-可以在括号中(如在任何常规函数中一样)或不括号中给出!走吧。
如果您问为什么?-您并不孤单。我也不知道
答案 1 :(得分:2)
所有这些Pseudocolumns
都用在SQL或PL / SQL语句(如列)中,但实际上并没有存储在磁盘上。可以将它们视为SQL语句中的专用数据元素,就像它们是表的一部分一样。
DML语句既不能应用于伪列,也不能由用户定义,因此不需要将其视为标准函数或过程,并且样式通常由Oracle本身定义。
顺便说一句,这种语法(不带括号)即使对于Oracle中的函数也是有效的,前提是不需要使用任何参数作为参数。 似乎比其他系统更合乎逻辑。
Oracle说:
Parameter declarations are optional. Functions that take no parameters are written without parentheses
答案 2 :(得分:2)
为了进一步混淆,某些SQL函数在“ STANDARD” PL / SQL包中定义了相应的PL / SQL函数。这样,可以在PL / SQL程序块中的赋值语句的右侧调用SYSDATE之类的功能。由于“ STANDARD”包中的函数是PL / SQL函数(而不是SQL函数),因此可以在带或不带括号的情况下调用它。
DECLARE
x DATE;
BEGIN
x:= SYSDATE(); -- Valid
x:= SYSDATE; -- Also valid
END;