저장 프로시저 호출하기

SQL CALL 명령을 사용하여 저장 프로시저를 호출할 수 있습니다.

사용자가 저장 프로시저를 호출하려면 사용자의 역할에 저장 프로시저에 대한 USAGE 권한 이 있어야 합니다.

저장 프로시저를 호출할 권한이 있으면 CALL 문을 사용하여 저장 프로시저를 호출할 수 있습니다.

참고

익명 프로시저를 만들기도 하고 호출도 하려면 CALL(익명 프로시저 사용) 를 사용하십시오. 익명 프로시저를 만들고 호출하는 데는 CREATE PROCEDURE 스키마 권한이 있는 역할이 필요하지 않습니다.

인자 지정하기

저장 프로시저에 인자가 있는 경우 해당 인자를 이름 또는 위치로 지정할 수 있습니다.

예를 들어 다음 저장 프로시저는 3개의 인자를 허용합니다.

CREATE OR REPLACE PROCEDURE sp_concatenate_strings(
    first_arg VARCHAR,
    second_arg VARCHAR,
    third_arg VARCHAR)
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
  BEGIN
    RETURN first_arg || second_arg || third_arg;
  END;
  $$;
Copy

프로시저를 호출할 때 인자를 이름으로 지정할 수 있습니다.

CALL sp_concatenate_strings(
  first_arg => 'one',
  second_arg => 'two',
  third_arg => 'three');
Copy
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree            |
+------------------------+

인자를 이름으로 지정하면 인자를 특정 순서로 지정할 필요가 없습니다.

CALL sp_concatenate_strings(
  third_arg => 'three',
  first_arg => 'one',
  second_arg => 'two');
Copy
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree            |
+------------------------+

인자를 위치로 지정할 수도 있습니다.

CALL sp_concatenate_strings(
  'one',
  'two',
  'three');
Copy
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree            |
+------------------------+

다음 사항을 참고하십시오.

  • 이름 또는 위치로 모든 인자를 지정해야 합니다. 일부 인자는 이름으로, 다른 인자는 위치로 지정할 수는 없습니다.

    이름으로 인자를 지정할 때 인자 이름 주위에 큰따옴표를 사용할 수 없습니다.

  • 두 함수 또는 두 프로시저가 이름은 같지만 인자 유형이 다른 경우 인자 이름이 다르면 인자 이름을 사용하여 실행할 함수 또는 프로시저를 지정할 수 있습니다. 프로시저 및 함수 오버로딩하기 섹션을 참조하십시오.

선택적 인자 지정하기

저장 프로시저에 선택적 인자 가 있는 경우 호출에서 선택적 인자를 생략할 수 있습니다. 각 선택적 인자에는 인자가 생략될 때 사용되는 기본값이 있습니다.

예를 들어 다음 저장 프로시저에는 필수 인자 1개와 선택적 인자 2개가 있습니다. 각 선택적 인자에는 기본값이 있습니다.

CREATE OR REPLACE PROCEDURE build_string_proc(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
    BEGIN
      RETURN prefix || word || suffix;
    END;
  $$
  ;
Copy

호출에서 선택적 인자를 생략할 수 있습니다. 인자를 생략하면 인자의 기본값이 사용됩니다.

CALL build_string_proc('hello');
Copy
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-post    |
+-------------------+
CALL build_string_proc('hello', 'before-');
Copy
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| before-hello-post |
+-------------------+

선택적 인자를 생략하고 서명에서 생략된 인자 뒤에 나타나는 다른 선택적 인자를 지정해야 하는 경우 위치 인자 대신 명명된 인자를 사용하십시오.

예를 들어 prefix 인자를 생략하고 suffix 인자를 지정한다고 가정해 보겠습니다. suffix 인자는 서명에서 prefix 뒤에 나타나므로 인자를 이름으로 지정해야 합니다.

CALL build_string_proc(word => 'hello', suffix => '-after');
Copy
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-after   |
+-------------------+

저장 프로시저를 실행하려면 CALL 문을 사용하십시오. 예:

call stproc1(5.14::FLOAT);
Copy

저장 프로시저에 대한 각 인자는 일반 식일 수 있습니다.

CALL stproc1(2 * 5.14::FLOAT);
Copy

인자는 하위 쿼리일 수 있습니다.

CALL stproc1(SELECT COUNT(*) FROM stproc_test_table1);
Copy

CALL 문당 하나의 저장 프로시저만 호출할 수 있습니다. 예를 들어 다음 문은 실패합니다.

call proc1(1), proc2(2);                          -- Not allowed
Copy

또한, 저장 프로시저 CALL을 식의 일부로 사용할 수 없습니다. 예를 들어, 다음 문은 모두 실패합니다.

call proc1(1) + proc1(2);                         -- Not allowed
call proc1(1) + 1;                                -- Not allowed
call proc1(proc2(x));                             -- Not allowed
select * from (call proc1(1));                    -- Not allowed
Copy

하지만 저장 프로시저 내에서, 저장 프로시저는 다른 저장 프로시저를 호출하거나 재귀적으로 자신을 호출할 수 있습니다.

조심

중첩 호출은 최대 허용 스택 깊이를 초과할 수 있으므로 호출을 중첩할 때, 특히 재귀를 사용할 때 주의하십시오.