본문 바로가기

DB/Oracle

CALL문과 EXECUTE 커맨드의 차이

CALL은 Oracle 9i부터 생긴 표준 SQL의 커맨드이며, EXECUTE는 예전부터 있는 SQL*Plus 커맨드이다.

양쪽 모두 펑션이나 프로시저의 실행에 사용하지만, 그 사양은 달라 새롭게 준비된 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로 만들지 않는 함수를 호출해도 사용할 수 없는 것처럼 SQL로 실행되지 않는다.

아! 이게 뭔말이야!