CALL

CALL 문은 데이터 베이스에 정의된 메서드 또는 저장 함수/프로시저와 같은 저장 루틴을 호출하기 위해 사용한다. CUBRID에서 지원하는 저장 루틴은 다음과 같다.

CALL <routine_clause> ;

    <routine_clause> ::=
        routine_name ([<arg_value> [{, <arg_value> } ...]]) [<method_call_target>] [<to_variable>]

    <arg_value>
        literal |
        :host_variable |
        any CSQL expression

    <method_call_target> ::=
        ON [CLASS] object-valued-expression

    <to_variable> ::=
        INTO :host_variable |
        TO :host_variable
  • routine_name: 호출할 메서드 또는 저장 함수/프로시저의 이름을 지정한다. 대소문자를 구분하지 않는다.

  • <arg_value>: 호출할 저장 루틴의 인수를 지정한다. 리터럴 값, 호스트 변수와 표현식을 지정할 수 있다.

  • <method_call_target>: C로 작성한 메서드를 사용할 때만 지정한다. 클래스 이름, 변수, 혹은 또 다른 메서드 호출(객체를 반환하는)을 포함하는 객체 값의 표현식(object-valued-expression)을 지정한다. 만약 클래스 객체에서 동작하는 클래스 메서드를 호출하려면, <call_target> 앞에 반드시 CLASS 키워드가 있어야 한다. 이 경우 클래스 이름은 클래스 메서드가 정의된 클래스의 이름이어야 한다. 만약 인스턴스 메서드를 호출하려면, 인스턴스 객체를 나타내는 식을 지정해야 한다.

  • <to_variable>: 저장 루틴이 반환하는 값을 호스트 변수에 저장할 수 있다.

CALL 문에서 지정한 이름에 대하여 CUBRID에 등록된 저장 루틴을 다음과 같이 검색한다.

  1. CALL 문에 대상 클래스가 있는 경우 메서드로 처리한다.

  2. CALL 문에 대상 클래스가 없는 경우 먼저 Java 저장 함수/프로시저 수행 여부를 검사하고 같은 이름이 존재하면 수행한다.

  3. 2에서 Java 저장 함수/프로시저가 존재하지 않으면 메서드 수행 여부를 검사하여 같은 이름이 존재하면 수행한다.

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

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

  • CALL 문에 인자가 없는 경우는 메서드와 구분되므로 “ERROR: Stored procedure/function ‘deposit’ does not exist.”라는 오류 메시지가 나타난다.

  • CALL 문에 인자가 있는 경우에는 메서드와 구분할 수 없기 때문에 “ERROR: Methods require an object as their target.”이라는 메시지가 나타난다.

// CALL 문에 인자가 없는 경우
CALL deposit();
ERROR: Stored procedure/function 'deposit' does not exist.
// CALL 문에 인자가 있는 경우
CALL deposit('Tom', 3000000);
ERROR: Methods require an object as their target.

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

CALL phone_info('Tom', CALL sp_int(999));
CALL phone_info((SELECT * FROM Phone WHERE id='Tom'));