不带参数的Oracle函数

时间:2019-06-08 23:18:36

标签: oracle function

为什么调用CURRENT_DATECURRENT_TIMESTAMPSYSDATESYSTIMESTAMP时没有括号。我知道它们不带参数,但是在其他语言中,您仍然可以使用括号来调用函数。在Oracle中,任何永不接受参数的函数都不能用括号调用吗?

如果有人可以指出我的文档,我将不胜感激。

3 个答案:

答案 0 :(得分:5)

Oracle在许多方面都很奇怪。它在许多方面起着快速而松散的作用:NULL的含义,隐式数据类型转换以及大量其他事情。

正如您所注意到的,在它们中间是调用没有参数的函数的语法不一致。 (对于声明这样的功能,也请参见下文。)

sysdatecurrent_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;