CALL 사용

등록된 Java 저장 함수/프로시저는 CALL 문을 사용하거나, SQL 문에서 호출하거나, Java 응용프로그램에서 호출될 수 있다.

다음과 같이 CALL 문을 사용하여 호출할 수 있다. CALL 문에서 호출되는 Java 저장 함수/프로시저의 이름은 대소문자를 구분하지 않는다.

구문

CALL {procedure_name ([param[, param]…]) | function_name ([param[, param]…]) INTO :host_variable
param {literal | :host_variable}

예제

call Hello() into :HELLO;
call Sp_int(3) into :i;
call phone_info('Tom','016-111-1111');

CUBRID에서는 Java 저장 함수/프로시저를 같은 CALL 문을 이용해 호출한다. 따라서 다음과 같이 CALL 문을 처리하게 된다.

  1. CALL 문에 대상 클래스가 있는 경우 메소드로 처리한다.
  2. CALL 문에 대상 클래스가 없는 경우 먼저 Java 저장 함수/프로시저 수행 여부를 검사하고 Java 저장 함수/프로시저가 존재하면 Java 저장 함수/프로시저를 수행한다.
  3. 2에서 Java 저장 함수/프로시저가 존재하지 않으면 메소드 수행 여부를 검사하여 같은 이름이 존재하면 수행한다.

만약 존재하지 않는 Java 저장 함수/프로시저를 호출하는 경우에는 다음과 같은 에러가 나타난다.

csql> call deposit()
csql> ;xrun

In the command from line 1,

ERROR: Stored procedure/function 'deposit' is not exist.

0 command(s) successfully processed.

csql> call deposit('Tom', 3000000)
csql> ;xrun

In line 1, column 6,

ERROR: Methods require an object as their target.

0 command(s) successfully processed.

CALL 문에 인자가 없는 경우는 메소드와 구분되므로 "ERROR: Stored procedure/function 'deposit' is not exist."라는 오류 메시지가 나타난다. 하지만, CALL 문에 인자가 있는 경우에는 메소드와 구분할 수 없기 때문에 "ERROR: Methods require an object as their target."이라는 메시지가 나타난다.

그리고, 아래와 같이 Java 저장 함수/프로시저를 호출하는 CALL 문 안에 CALL 문이 중첩되는 경우와 CALL 문을 사용하여 Java 저장 함수/프로시저 호출 시 인자로 서브 질의를 사용할 경우 CALL 문은 수행이 되지 않는다.

call phone_info('Tom', call sp_int(999));
call phone_info((select * from Phone where id='Tom'));

Java 저장 함수/프로시저를 호출하여 수행 중 exception이 발생하면 dbname_java.log 파일에 exception 내용이 기록되어 저장된다. 만약 화면으로 exception 내용을 확인하고자 할 경우는 $CUBRID/java/logging.properties 파일의 handlers 값을 " java.lang.logging.ConsoleHandler" 로 수정하면 화면으로 exception 내용을 출력한다.