web-dev-qa-db-ja.com

Oracle SQLストアドプロシージャの呼び出しと実行

問題

Oracle SQLコマンドCALLEXECUTEの違いを理解しようとしています。

私はCALLを使用してストアドプロシージャを開始しましたが、別の開発者と話していると、彼がEXECUTEをほぼ独占的に使用していることがわかりました。オンラインで調べて何か間違ったことをしていないか確認しましたが、2つのコマンドの明確な違いがわかりません。

ドキュメントに基づいて、それらは(少なくともストアドプロシージャとの相互作用に関して)非常に似ているように見えます。

CALLは汎用のSQLコマンドのように見えますが、EXECUTEは独自仕様のようですので、CALLEXECUTEよりも使用する傾向がありますが、もう一度パフォーマンスに関してそれが何を意味するのか分からない。

質問

  • ストアドプロシージャの開始という点では、どちらが望ましいですか?それは重要ですか?
  • それが重要な場合、どちらが適切な状況ですか?
  • 2つの間にパフォーマンスの違いはありますか?ベストプラクティスは何ですか?
16
DanK

EXEC[ute] SP()CALL SP()の両方をSQL * Plusで使用して、SPを実行できます。ところで、BEGIN SP(); END;を使用することもできます

しかし、いくつかの違いがあります。

  1. CALLはOracle SQLであり、どこでも機能するはずです。 Oracleと通信できる他のDBクライアントは、SQL * Plus EXECをサポートする場合とサポートしない場合があります。多くの場合(たとえば、Oracle SQL Developer、SQLWorkbench/J)、そうでない場合もあります(Liquibase)。

  2. CALLステートメントによって渡されるパラメーターのデータ型は、SQLデータ型でなければなりません。 BOOLEANなどのPL/SQLのみのデータ型にすることはできません。

  3. EXECを使用して、SPだけでなく任意のステートメントを実行できます。

  4. SPにパラメーターがない場合、_EXEC SP;_構文を使用できますが、CALLには空の括弧が必要です:CALL SP();

19
DKroot

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はタイプ(この場合はカーソル)の入力を求めます。

0
Jefferstone