CALL 文 と EXECUTE コマンドの違い
CALL は Oracle 9i からサポートされた 標準SQL のコマンドであり、EXECUTE は旧来からある SQL*Plus コマンド である。(※ PL/SQL のコマンドでもない)
双方ともファンクションやプロシージャの実行に使用するが、その仕様は異なり新しく用意された CALL が良いというものでもないといえる。
Oracle 10g までは CALL の引数は位置表記法のみに限定されていたが Oracle 11g からは 位置表記法および両方を併用した混合表記も可能になっている。
同時に SQL の関数の呼び出しも 位置表記法と混合表記がサポートされた。
EXECUTE の実行例
EXECUTE コマンドは テキストを PL/SQL ブロックに変換してから実行する。
EXECUTE plsql_text; は BEGIN plsql_text; END; に変換してから実行されているということである。
SQL> variable :num number;
SQL> EXECUTE :num := function_hoge('あいう', TRUE);
↓ 変換
BEGIN :num := function_hoge('あいう', TRUE); END;
↓ 実行
PL/SQLプロシージャが正常に完了しました。
SQL> print :num
...
CALL の実行例
CALL による呼び出しで SQL として、まだサポートされていない BOOLEAN 型 (TRUE/FALSE) を PL/SQL のファンクションに使用すると・・・
SQL> variable :num number;
SQL> CALL function_hoge('あいう', TRUE) INTO :num ;
*
行1でエラーが発生しました。:
ORA-06553: PLS-306: 'FUNCTION_HOGE'の呼出しで、引数の数または型が正しくありません。
のようにエラーが発生する。
(予想であるが)SQL のパーサー経由(※) と PL/SQL パーサー経由で実行される差のようなものがあると思われる。
(※) CALL 経由で PL/SQL に組み込まれていない関数(例えば ORA_HASH)を呼び出しても利用できないことから SQL として実行はされていない。