Функции Oracle, которые не принимают параметров - PullRequest
3 голосов
/ 09 июня 2019

Почему CURRENT_DATE, CURRENT_TIMESTAMP, SYSDATE и SYSTIMESTAMP вызываются без скобок.Я понимаю, что они не принимают параметров, но в других языках вы все равно вызывали бы функции, используя скобки.Возможно ли, что в Oracle любая функция, которая никогда не принимает параметры, не может быть вызвана с круглыми скобками?

Если бы кто-то мог указать мне на документацию по этому вопросу, я был бы признателен.

Ответы [ 3 ]

5 голосов
/ 09 июня 2019

Oracle странен во многих отношениях.Он играет быстро и свободно со многими вещами: значение NULL, неявные преобразования типов данных и целый ряд других вещей.

Среди них, как вы заметили, их несовместимый синтаксис для вызова функцийбез параметров.(Для объявления таких функций тоже - см. Ниже.)

Собственные функции, такие как sysdate и current_timestamp, которые не принимают аргументы, должно быть написано без скобок.Вы запрашиваете документацию ... самый прямой (и все же не вполне удовлетворительный) указатель - на документацию каждой функции, где синтаксис очень четко показан без скобок.Что вы ищете - отдельное упоминание в документации, где это прямо указано?

Сравните это с аналитическими функциями, такими как, например, rownumber(), которые также не принимают аргументов.Вы должны написать их с пустыми скобками!

Хуже: для функций вы пишете себя в PL / SQL и вызываете из операторов SQL:если функция не принимает аргументов, то она должна быть определена без скобок.Однако, когда вы вызываете его (например, в операторе select), вы можете назвать его с или без (пусто)) круглые скобки - оба синтаксиса действительны.Не так, увы, с нативными функциями, такими как sysdate.Зачем?Опять же, хороший вопрос, чтобы задать Oracle.

Это также не заканчивается.connect_by_root - это «иерархическая функция» (функция, которая может использоваться в иерархических запросах).Он принимает аргумент - который может быть указан в скобках (как в любой обычной функции) или без скобок!Иди цифру.

Если спросить ПОЧЕМУ ??? - ты не одинок.Я тоже понятия не имею.

2 голосов
/ 09 июня 2019

Для дальнейшего запутывания некоторые функции SQL имеют соответствующие функции PL / SQL, определенные в пакете PL / SQL "STANDARD". Это позволяет вызывать такие функции, как SYSDATE, справа от оператора присваивания в программном блоке PL / SQL. Поскольку функция в пакете «STANDARD» является функцией PL / SQL (а не функцией SQL), ее можно вызывать с круглыми скобками или без них.

DECLARE
  x DATE;
BEGIN
  x:= SYSDATE();  -- Valid
  x:= SYSDATE;    -- Also valid
END;
2 голосов
/ 09 июня 2019

Это все Pseudocolumns, которые используются в выражениях SQL или PL / SQL, таких как столбцы, но на самом деле они не хранятся на диске.Их можно рассматривать как элементы данных специального назначения в инструкциях SQL, как если бы они были частью таблицы.

Оператор DML не применяется ни к псевдоколонкам, ни к пользовательским, поэтому они не должны рассматриваться как стандартные функции или процедуры, а стиль обычно определяется самим Oracle.

Кстати, этот синтаксис (без скобок) действителен даже для функции в Oracle при условии, что нет необходимости иметь какой-либо параметр, который кажется более логичным, чем то, что делают другие системы.

Оракул говорит: Parameter declarations are optional. Functions that take no parameters are written without parentheses

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...