Skip to content

Commit

Permalink
[CUBRIDMAN-221] 프로시저 생성 관련 기능과 성능 최적화 추가 (#590)
Browse files Browse the repository at this point in the history
  • Loading branch information
hgryoo authored Jan 23, 2025
1 parent d8c4305 commit 5efb584
Show file tree
Hide file tree
Showing 6 changed files with 406 additions and 9 deletions.
3 changes: 2 additions & 1 deletion ko/pl/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@
CUBRID PL
***************

이 장에서는 저장 프로시저와 저장 함수를 사용하기 위해 지원하는 CUBRID SQL에서 제공하는 확장 기능을 소개한다.
이 장에서는 저장 프로시저와 저장 함수를 사용할 수 있도록 CUBRID 에서 제공하는 절차적 언어 확장 기능을 소개한다.

.. toctree::
:maxdepth: 2

pl_intro
pl_authid
pl_package
pl_tuning
plcsql
jsp
method
42 changes: 39 additions & 3 deletions ko/pl/pl_authid.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
소유자 권한과 호출자 권한
-----------------------------

저장 프로시저는 **소유자** 권한 또는 **호출자** 권한으로 실행될 수 있다. 동시에 두 가지 권한으로 실행할 수 없고, 저장 프로시저를 만들 때 지정한 권한으로 실행된다. 이 권한은 **AUTHID**\로 지정한다.
저장 프로시저의 생성과 **AUTHID**\의 지정에 대한 자세한 내용은 :doc:`/sql/schema/stored_routine_stmt`\를 참고한다.
저장 프로시저와 저장 함수는 **소유자** 권한 또는 **호출자** 권한으로 실행될 수 있다. 실행 권한은 저장 프로시저 또는 저장함수 생성시 둘 중 하나를 선택하여 생성할 수 있으며, 지정한 권한으로 실행된다.

다음은 각 권한에 대한 설명과 차이점을 설명한다.

Expand All @@ -15,15 +14,52 @@

반면에 호출자 권한은 다음과 같다.

* **호출자 권한** (Caller's Rights 또는 Invoker's Rights): 저장 프로시저를 호출하는 사용자의 권한으로 실행된다.
* **호출자 권한** (Caller's Rights 또는 Invoker's Rights)
* 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한으로 실행된다.
* 호출자 권한으로 저장 프로시저를 만들고 다른 유저에게 권한을 부여하면, 저장 프로시저를 호출하는 사용자의 권한으로 실행된다.
* 호출자 권한으로 저장 프로시저를 만들면 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한 수준에서 실행되므로 호출자의 권한으로 데이터베이스 객체에 접근할 수 있다. 따라서 호출자 권한으로 저장 프로시저를 만들 때는 호출자의 권한 수준을 고려하여 저장 프로시저를 만들어야 한다.
* 호출자별로 권한을 다르게 적용해야할 경우에 적합하다.

저장 프로시저 생성 시 소유자 권한과 호출자 권한의 차이를 이해하고 저장 프로시저를 활용하면 보다 효율적으로 데이터베이스를 관리하는 것이 필요하다.

저장 프로시저 또는 저장 함수 생성 시 **AUTHID** 속성을 지정하여 **소유자 권한** 또는 **호출자 권한** 으로의 동작 여부를 지정할 수 있다. 정의문에 대한 자세한 내용은 :doc:`/sql/schema/stored_routine_stmt`\를 참고한다.

**AUTHID** 속성을 다음과 같이 지정할 수 있으며, **DEFINER**\와 **OWNER** 그리고 **CURRENT_USER**\와 **CALLER**\는 동의어이다.

* **소유자 권한**: AUTHID DEFINER 또는 AUTHID OWNER
* **호출자 권한**: AUTHID CURRENT_USER 또는 AUTHID CALLER

속성을 지정하지 않으면 기본적으로 **소유자 권한**\으로 동작한다.

다음은 DBA 사용자로 로그인하여 :ref:`fn_current_user` 를 반환하는 DBA 소유자 권한의 저장 함수를 만들고 U1 사용자에서 호출하는 예이다.

.. code-block:: sql
-- DBA로 로그인
CREATE USER U1;
CREATE OR REPLACE FUNCTION fn_current_user() RETURN STRING AUTHID DEFINER AS
BEGIN
RETURN CURRENT_USER;
END;
GRANT EXECUTE ON PROCEDURE fn_current_user TO U1;
CALL login ('U1', '') ON CLASS db_user;
SELECT dba.fn_current_user();
::

dba.fn_current_user()
======================
'DBA@<host>'

.. warning::

* CUBRID의 PL/CSQL에서는 현재 **소유자 권한** 만을 지원하고 있으며, **호출자 권한**\은 지원하지 않는다.
* **호출자 권한**\을 사용하기 위해서는 Java SP를 사용하여 저장 프로시저를 작성해야 한다.

.. note::

* **소유자 권한**\은 CUBRID 11.4 버전부터 지원한다.
151 changes: 151 additions & 0 deletions ko/pl/pl_intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,154 @@

* PL/CSQL
* Java

저장 프로시저의 생성
==============================

.. _pl-supported_sql_type:

지원하는 인수와 결과 데이터 타입
--------------------------------------

저장 프로시저와 저장 함수의 인수와 결과 데이터 타입으로 CUBRID SQL이 지원하는 데이터 타입 중 일부 데이터 타입을 명시할 수 있다.
다음의 표는 언어 확장에서 지원하는 데이터 타입이다.

+----------------+-------------------------------------+----------+----------+
| | | 지원 여부 (O, X) |
+ 유형 + 타입 +----------+----------+
| | | PL/CSQL | Java SP |
+================+=====================================+==========+==========+
| 수치 | SHORT, SMALLINT | O | O |
+ +-------------------------------------+----------+----------+
| | INTEGER, INT | O | O |
+ +-------------------------------------+----------+----------+
| | BIGINT | O | O |
+ +-------------------------------------+----------+----------+
| | NUMERIC, DECIMAL | O | O |
+ +-------------------------------------+----------+----------+
| | FLOAT, REAL | O | O |
+ +-------------------------------------+----------+----------+
| | DOUBLE, DOUBLE PRECISION | O | O |
+----------------+-------------------------------------+----------+----------+
| 날짜/시간 | DATE, TIME, TIMESTAMP, DATETIME | O | O |
+ +-------------------------------------+----------+----------+
| | TIMESTAMPLTZ, TIMESTAMPTZ | X | X |
| | DATETIMELTZ, DATETIMETZ | | |
+----------------+-------------------------------------+----------+----------+
| 문자열 | CHAR, VARCHAR, STRING, CHAR VARYING | O | O |
+----------------+-------------------------------------+----------+----------+
| 컬렉션 | SET, MULTISET, LIST, SEQUENCE | X | O |
+----------------+-------------------------------------+----------+----------+
| 기타 | BIT, BIT VARYING | X | X |
+ +-------------------------------------+----------+----------+
| | ENUM | X | X |
+ +-------------------------------------+----------+----------+
| | BLOB/CLOB | X | X |
+ +-------------------------------------+----------+----------+
| | JSON | X | X |
+ +-------------------------------------+----------+----------+
| | CURSOR | X | O* |
+----------------+-------------------------------------+----------+----------+

* Java SP에서는 CURSOR 타입에 대해서 반환 타입만을 지원하며, 인수 타입으로는 지원하지 않는다.


지원하지 않는 데이터 타입을 사용해서 저장 프로시저를 생성하면 다음과 같은 오류가 발생한다.

.. code-block:: sql
CREATE FUNCTION unsupported_json() RETURN JSON
AS BEGIN RETURN NULL; END;
CREATE PROCEDURE unsupproted_args (arg TIMESTAMPLTZ)
AS BEGIN NULL; END;
::

ERROR: Unsupported return type 'json' of the stored procedure

ERROR: before ' )
AS BEGIN NULL; END; '
Unsupported argument type 'timestampltz' of the stored procedure

.. _pl-default-argument:

기본값 인수 사용
------------------------------

저장 프로시저와 저장 함수의 인수에 기본값을 지정할 수 있다.

* **:=** 또는 **DEFAULT** 키워드를 사용하여 기본값을 지정할 수 있다.
* 기본값을 지정하면 저장 프로시저와 저장 함수의 인수를 생략하고 호출할 수 있다. 생략된 인수는 기본값으로 대체된다.
* 기본값은 리터럴 값으로 지정할 수 있으며, 255 바이트 이하의 문자열 값으로 저장한다. 이 때 크기를 초과하면 오류가 발생한다.
* 기본값에 리터럴 값 외에 허용하는 함수는 다음과 같다.

+-------------------------------+---------------+
| 기본값 | 데이터 타입 |
+===============================+===============+
| SYS_TIMESTAMP | TIMESTAMP |
+-------------------------------+---------------+
| UNIX_TIMESTAMP() | INTEGER |
+-------------------------------+---------------+
| CURRENT_TIMESTAMP | TIMESTAMP |
+-------------------------------+---------------+
| SYS_DATETIME | DATETIME |
+-------------------------------+---------------+
| CURRENT_DATETIME | DATETIME |
+-------------------------------+---------------+
| SYS_DATE | DATE |
+-------------------------------+---------------+
| CURRENT_DATE | DATE |
+-------------------------------+---------------+
| SYS_TIME | TIME |
+-------------------------------+---------------+
| CURRENT_TIME | TIME |
+-------------------------------+---------------+
| USER, USER() | STRING |
+-------------------------------+---------------+
| TO_CHAR(date_time[, format]) | STRING |
+-------------------------------+---------------+
| TO_CHAR(number[, format]) | STRING |
+-------------------------------+---------------+

다음은 기본값에 리터럴 값을 지정하는 간단한 예시이다.

.. code-block:: sql
CREATE FUNCTION default_args (
a INT := 1,
b INT DEFAULT 2
) RETURN INT
AS BEGIN RETURN a + b; END;
SELECT default_args(); -- 3
SELECT default_args(3); -- 5
SELECT default_args(3, 4); -- 7
::

default_args()
================
3

default_args(3)
=================
5

default_args(3, 4)
====================
7

다음은 기본값에 함수를 지정하는 예시이다.

.. code-block:: sql
CREATE FUNCTION default_args_func (
a INT := UNIX_TIMESTAMP(),
b DATE DEFAULT CURRENT_DATE
) RETURN INT
AS BEGIN RETURN a + b; END;
SELECT default_args_func(); -- UNIX_TIMESTAMP() + CURRENT_DATE
SELECT default_args_func(3); -- 3 + CURRENT_DATE
SELECT default_args_func(3, 4); -- 3 + 4
8 changes: 8 additions & 0 deletions ko/pl/pl_limits.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-----------------------------
저장 프로시저 제한 사항
-----------------------------

CUBRID의 저장 프로시저와 저장 함수에 대하여 다음의 제한 사항을 가진다.

* **최대 호출 수**: 저장 프로시저와 저장 루틴의 허용된 최대 호출 수는 16으로 제한된다.
* **함수 오버로딩**: 인수의 데이터 타입이 다른 같은 이름의 저장 프로시저를 생성할 수 없다. **CREATE OR REPLACE** 구문을 사용하는 경우 기존에 등록한 프로시저를 삭제 후 새로운 프로시저를 생성한다.
Loading

0 comments on commit 5efb584

Please sign in to comment.