問題
Oracle SQLコマンドCALL
とEXECUTE
の違いを理解しようとしています。
私はCALL
を使用してストアドプロシージャを開始しましたが、別の開発者と話していると、彼がEXECUTE
をほぼ独占的に使用していることがわかりました。オンラインで調べて何か間違ったことをしていないか確認しましたが、2つのコマンドの明確な違いがわかりません。
ドキュメントに基づいて、それらは(少なくともストアドプロシージャとの相互作用に関して)非常に似ているように見えます。
CALL
は汎用のSQLコマンドのように見えますが、EXECUTE
は独自仕様のようですので、CALL
をEXECUTE
よりも使用する傾向がありますが、もう一度パフォーマンスに関してそれが何を意味するのか分からない。
質問
EXEC[ute] SP()
とCALL SP()
の両方をSQL * Plusで使用して、SPを実行できます。ところで、BEGIN SP(); END;
を使用することもできます
しかし、いくつかの違いがあります。
CALL
はOracle SQLであり、どこでも機能するはずです。 Oracleと通信できる他のDBクライアントは、SQL * Plus EXECをサポートする場合とサポートしない場合があります。多くの場合(たとえば、Oracle SQL Developer、SQLWorkbench/J)、そうでない場合もあります(Liquibase)。
CALL
ステートメントによって渡されるパラメーターのデータ型は、SQLデータ型でなければなりません。 BOOLEANなどのPL/SQLのみのデータ型にすることはできません。
EXEC
を使用して、SPだけでなく任意のステートメントを実行できます。
SPにパラメーターがない場合、_EXEC SP;
_構文を使用できますが、CALL
には空の括弧が必要です:CALL SP();
Toadを使用してsys_refcursorを返すプロシージャを呼び出す場合、CALLとEXECの間には違いがあります。
プロシージャfoo(i in number、o out sys_refcursor)を作成して、select i for dualのopen oを開始します。終わり;
exec foo(1、:r); -1行を出力します
foo(1、:r);を呼び出します。 -0行を出力します
-注:パラメータの前にコロンを付けると、Toadはタイプ(この場合はカーソル)の入力を求めます。