Oracle无参函数调用规则咨询:为何CURRENT_DATE等无需括号?
嘿,这个问题问得特别好——毕竟在Java、Python这些语言里,哪怕是无参函数也得老老实实加括号,Oracle这儿的规则确实容易让人困惑,我来给你捋清楚:
为什么CURRENT_DATE这类对象不用括号?
其实CURRENT_DATE、CURRENT_TIMESTAMP、SYSDATE、SYSTIMESTAMP在Oracle里不是传统意义上的无参函数,它们属于「伪列(Pseudocolumns)」或者说是Oracle专门设计的「内置日期时间特殊函数」。这类对象的本质更像是数据库提供的"动态常量",Oracle为了简化使用,特意允许不带括号调用它们。
而且有意思的是,你哪怕给它们加上括号,比如写SYSDATE(),Oracle也能正常识别并返回正确结果——它会自动忽略这个多余的括号,这也从侧面说明它们和普通函数的区别。
Oracle是不是所有无参函数都不能带括号?
当然不是!大部分普通的无参函数还是必须带括号调用的,举几个例子:
USER():返回当前数据库用户,必须写括号;如果省略括号写USER,其实是引用了另一个同名伪列,虽然结果一致,但语法上是两种不同的对象UID():返回当前用户的ID,必须带括号调用DBMS_RANDOM.VALUE():无参时生成0到1之间的随机数,必须带括号
只有Oracle特意标记的少数特殊函数/伪列,才允许省略括号,除了你提到的日期时间类,还有SESSIONTIMEZONE、DBTIMEZONE这类也可以不带括号。
官方文档的说明
在Oracle Database SQL Language Reference文档中,关于「伪列」的章节明确指出:
伪列是看起来像表列但实际不存储在表中的值,可像表列一样在SQL语句中使用。
SYSDATE、SYSTIMESTAMP、CURRENT_DATE、CURRENT_TIMESTAMP均属于此类伪列,支持省略括号调用。
另外在「内置函数」章节,针对这些特殊函数的条目里,也会标注它们的调用语法可以省略括号。
内容的提问来源于stack exchange,提问作者Webucator

