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 передает управление хранимой процедуре или модулю.
Как вы видите концептуально, они совершенно разные. Однако, если вы просто выполняете процедуру, на практике для этого варианта использования они одинаковы.
Я считаю, что для получения четкого кода, если вам не нужно выполнить, вы должны использовать вызов.