Oracle SQL хранимые процедуры Вызов против выполнения

Проблема

Я пытаюсь понять разницу между командами Oracle SQL CALL и EXECUTE.

Я использовал CALL для запуска хранимых процедур, но, разговаривая с другим разработчиком, я обнаружил, что он почти исключительно использует EXECUTE. Я провел некоторое исследование в Интернете, чтобы узнать, не сделал ли я что-то неправильно, но я не вижу четкого различия между этими двумя командами, и люди, похоже, используют их взаимозаменяемо.

Основываясь на документации, они кажутся очень похожими (по крайней мере, с точки зрения взаимодействия с хранимыми процедурами).

Похоже, что CALL - это универсальная команда SQL, а EXECUTE, по-видимому, является запатентованной, поэтому я бы склонен использовать CALL over EXECUTE, но опять же я не знаю, что это значит в отношении к производительности.

Вопросы

  • Является предпочтительным для других с точки зрения запуска хранимой процедуры? Это имеет значение?
  • Если это имеет значение, что такое ситуация, когда это подходит?
  • Существуют ли различия в производительности между этими двумя? Какая передовая практика?

Ответ 1

Оба EXEC[ute] SP() и CALL SP() могут использоваться в SQL * Plus для выполнения SP. BTW, вы также можете использовать BEGIN SP(); END;

Но есть некоторые отличия.

  • CALL - это Oracle SQL и должен работать везде. Другие клиенты БД, которые могут разговаривать с Oracle, могут или не могут поддерживать SQL * Plus EXEC. Многие из них (например, Oracle SQL Developer, SQLWorkbench/J), но некоторые из них не являются (Liquibase).

  • Типы данных, передаваемые оператором CALL, должны быть типами данных SQL. Они не могут быть типами данных PL/SQL, такими как BOOLEAN.

  • EXEC может использоваться для выполнения не только SP, но и произвольного оператора.

  • Если у SP нет параметров, вы можете использовать синтаксис EXEC SP;, но CALL требует пустых круглых скобок: CALL SP();

Ответ 2

Если вы вызываете proc, который возвращает sys_refcursor с помощью Toad, существует разница между CALL и EXEC.

создать процедуру foo (i в числе, o out sys_refcursor) в виде начать   открыть o для   выберите я из двойного; конец;

exec foo (1,: r); - выходы 1 строка

вызов foo (1,: r); - выводит 0 строк

- Примечание: если вы префиксного параметра с двоеточием, Toad предложит вам тип (который в этом случае является курсором).

Ответ 3

EXECUTE принимает строку в качестве параметра, который позволяет вам "выполнить" динамический sql. Выполнение в основном говорит... с этой строкой ввода запускается SQL-движок в содержимом.

CALL передает управление хранимой процедуре или модулю.

Как вы видите концептуально, они совершенно разные. Однако, если вы просто выполняете процедуру, на практике для этого варианта использования они одинаковы.

Я считаю, что для получения четкого кода, если вам не нужно выполнить, вы должны использовать вызов.