ALTER FUNCTION
기능
Function을 recompile 한다.
구문
<alter function statement> ::=
ALTER FUNCTION function_name COMPILE
;사용 범위 및 접근 권한
<alter function statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 function의 소유자
Function이 속한 스키마에 대해 (ALTER PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
ALTER ANY PROCEDURE ON DATABASE
구문 규칙 및 파라미터
function_name
Compile 할 function의 이름이다. schema_name.func_name과 같이 function이 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
지정된 schema-level function을 recompile 한다.
사용 예
gSQL> ALTER FUNCTION FUNC1 COMPILE; Function altered.
호환성
SQL 표준에서는 CREATE를 수행할 때 지정된 characteristic들을 변경하는 구문이고, GOLDILOCKS에서는 function의 plan을 다시 생성하는 구문이다.
Feature ID | 설명 | 지원 여부 |
|---|---|---|
F381 | Extended schema manipulation | O |
참조
자세한 내용은 다음을 참조한다.
ALTER PACKAGE
기능
Package를 recompile 한다.
구문
<alter package statement> ::=
ALTER PACKAGE package_name <package compile clause>
;
<package compile clause> ::=
COMPILE [PACKAGE|SPECIFICATION|BODY]사용 범위 및 접근 권한
<alter package statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 package의 소유자
Package가 속한 스키마에 대해 (ALTER PACKAGE 또는 CONTROL SCHEMA) ON SCHEMA
ALTER ANY PACKAGE ON DATABASE
구문 규칙 및 파라미터
package_name
Compile 할 package의 이름이다. schema_name.package_name과 같이 package가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
<package compile clause>
Package를 compile 할 대상을 지정한다. 만약 대상을 생략하면, PACKAGE를 지정한 것과 동일하게 package specification 과 package body 전체가 recompile 된다.
PACKAGE
Package specification과 body를 모두 recompile 한다.
SPECIFICATION
Package specification만 recompile 한다.
BODY
Package body만 recompile 한다.
설명
지정된 package를 recompile 한다. Compile 된 package의 실행 code는 plan cache에 저장된다.
사용 예
ALTER PACKAGE PKG1 COMPILE; Package altered.
ALTER PACKAGE PKG1 COMPILE PACKAGE; Package altered.
ALTER PACKAGE PKG1 COMPILE BODY; Package altered.
호환성
SQL 표준에서는 ALTER MODULE 구문이다.
참조
자세한 내용은 다음을 참조한다.
ALTER PROCEDURE
기능
Procedure를 recompile 한다.
구문
<alter procedure statement> ::=
ALTER PROCEDURE proc_name COMPILE
;사용 범위 및 접근 권한
<alter procedure statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 procedure의 소유자
Procedure가 속한 스키마에 대해 (ALTER PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
ALTER ANY PROCEDURE ON DATABASE
구문 규칙 및 파라미터
proc_name
Compile할 procedure의 이름이다. schema_name.proc_name과 같이 procedure가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
지정된 schema-level procedure를 recompile 한다.
사용 예
gSQL> CREATE OR REPLACE PROCEDURE PROC1( A1 INTEGER ) IS BEGIN INSERT INTO T1 VALUES( A1 ); END; / ERR-01000(16409): Warning: Routine definition has compilation errors ERR-HY000(17032): PSM compilation error : (1) at (5:15): ERR-17053: schema or table object does not exist Procedure created. gSQL> CALL PROC1(1); ERR-HY000(17032): PSM compilation error : (1) at (5:15): ERR-17053: schema or table object does not exist gSQL> CREATE TABLE T1( I1 INTEGER ); Table created. gSQL> COMMIT; Commit complete. gSQL> ALTER PROCEDURE PROC1 COMPILE; Procedure altered. gSQL> COMMIT; Commit complete. gSQL> CALL PROC1(2); Procedure Call complete. gSQL> SELECT * FROM T1; I1 -- 2 1 row selected.
호환성
SQL 표준에서는 CREATE를 수행할 때 지정된 characteristic들을 변경하는 구문이고, GOLDILOCKS에서는 procedure의 plan을 다시 생성하는 구문이다.
Feature ID | 설명 | 지원 여부 |
|---|---|---|
F381 | Extended schema manipulation | O |
참조
자세한 내용은 다음을 참조한다.
ALTER TRIGGER name COMPILE
기능
Trigger를 recompile 한다.
구문
<alter trigger compile statement> ::=
ALTER TRIGGER <trigger name> COMPILE
;사용 범위 및 접근 권한
<alter trigger compile statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 trigger의 소유자
Trigger가 속한 스키마에 대해 (ALTER TRIGGER 또는 CONTROL SCHEMA) ON SCHEMA
ALTER ANY TRIGGER ON DATABASE
구문 규칙 및 파라미터
<trigger name>
Compile할 trigger의 이름이다. schema_name.trigger_name과 같이 trigger가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
명시한 trigger를 recompile한다.
사용 예
-- Orders table이 update 될 때, orders의 변경 상태를 order_status_history에 기록하는 trigger이다.
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_status_audit
AFTER UPDATE OF status ON orders
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
BEGIN
INSERT INTO order_status_history VALUES( o_row.order_id,
o_row.status,
n_row.status,
SYSDATE );
END;
/
ERR-01000(16659): Warning: trigger "PUBLIC"."TRG_ORDERS_STATUS_AUDIT" has compilation errors :
(1) at (8:3): ERR-42000(16040): table or view does not exist
Trigger created.
-- Trigger가 invalid 하여 UPDATE 구문이 실패
gSQL>
UPDATE orders
SET status = 'Shipped', updated_at = SYSDATE
WHERE order_id = 1;
ERR-0W000(17134): TRIGGER(TRG_ORDERS_STATUS_AUDIT) compilation error :
(1) at (4:3): ERR-42000(16040): table or view does not exist
-- Trigger에서 참조하는 order_status_history table 생성
gSQL>
CREATE TABLE order_status_history( order_id NUMBER,
old_status VARCHAR2(20),
new_status VARCHAR2(20),
changed_at DATE );
Table created.
-- Trigger를 recompile 하여 상태 확인
gSQL> ALTER TRIGGER trg_orders_status_audit COMPILE;
Trigger altered.
-- 정상적으로 orders table에 대해 UPDATE 수행
gSQL>
UPDATE orders
SET status = 'Shipped', updated_at = SYSDATE
WHERE order_id = 1;
1 row updated.
gSQL> SELECT * FROM order_status_history;
ORDER_ID OLD_STATUS NEW_STATUS CHANGED_AT
-------- -------------- ---------- ----------
1 Order Received Shipped 2025-08-12
1 row selected.호환성
SQL 표준에는 정의되어 있지 않다.
참조
자세한 내용은 다음을 참조한다.
ALTER TRIGGER name ENABLE/DISABLE
기능
Trigger 활성화 여부를 변경한다.
구문
<alter trigger enforcement statement> ::=
ALTER TRIGGER <trigger name> <trigger enforcement>
;
<trigger enforcement> ::=
{ ENABLE | ENFORCED }
| { DISABLE | NOT ENFORCED }사용 범위 및 접근 권한
<alter trigger enforcement statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 trigger의 소유자
Trigger가 속한 스키마에 대해 (ALTER TRIGGER 또는 CONTROL SCHEMA) ON SCHEMA
ALTER ANY TRIGGER ON DATABASE
구문 규칙 및 파라미터
<trigger name>
활성화 상태를 변경하려는 trigger의 이름이다. schema_name.trigger_name과 같이 trigger가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
<trigger enforcement>
ENABLE 과 ENFORCED 는 동일한 의미이다. DISABLE 과 NOT ENFORCED 는 동일한 의미이다.
ENABLE
Event table에 DML 발생 시 trigger를 활성화한다.
DISABLE
Event table에 DML 발생 시 trigger를 비활성화한다.
설명
Trigger 활성화 여부를 변경한다.
사용 예
Trigger 비활성화 예
-- Invalid한 trigger 생성
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_status_audit
AFTER UPDATE OF status ON orders
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
BEGIN
INSERT INTO order_status_history VALUES( o_row.order_id,
o_row.status,
n_row.status,
SYSDATE );
END;
/
ERR-01000(16659): Warning: trigger "PUBLIC"."TRG_ORDERS_STATUS_AUDIT" has compilation errors :
(1) at (7:3): ERR-42000(16040): table or view does not exist
Trigger created.
-- Trigger가 invalid 하여 UPDATE 구문이 실패
gSQL>
UPDATE orders
SET status = 'Shipped', updated_at = SYSDATE
WHERE order_id = 1;
ERR-0W000(17134): TRIGGER(TRG_ORDERS_STATUS_AUDIT) compilation error :
(1) at (4:3): ERR-42000(16040): table or view does not exist
-- Trigger 비활성화
gSQL> ALTER TRIGGER trg_orders_status_audit DISABLE;
Trigger altered.
-- UPDATE 수행 성공
gSQL> UPDATE orders
SET status = 'Shipped', updated_at = SYSDATE
WHERE order_id = 1;
1 row updated.Trigger 활성화 예
-- 비활성화 상태인 invalid trigger 생성
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_status_audit
AFTER UPDATE OF status ON orders
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
DISABLE
BEGIN
INSERT INTO order_status_history VALUES (o_row.order_id, o_row.status, n_row.status, SYSDATE);
END;
/
ERR-01000(16659): Warning: trigger "PUBLIC"."TRG_ORDERS_STATUS_AUDIT" has compilation errors :
(1) at (8:3): ERR-42000(16040): table or view does not exist
Trigger created.
-- 생성 시 trigger가 비활성화 되어 있어서 실행되지 않음
gSQL>
UPDATE orders
SET status = 'Processing Order', updated_at = SYSDATE
WHERE order_id = 1;
1 row updated.
gSQL> SELECT * FROM order_status_history;
no rows selected.
-- Trigger에서 참조하는 order_status_history table 생성
gSQL>
CREATE TABLE order_status_history( order_id NUMBER,
old_status VARCHAR2(20),
new_status VARCHAR2(20),
changed_at DATE );
Table created.
-- Trigger를 recompile 하여 상태 확인
gSQL> ALTER TRIGGER trg_orders_status_audit COMPILE;
Trigger altered.
-- Trigger 활성화
gSQL> ALTER TRIGGER trg_orders_status_audit ENABLE;
Trigger altered.
-- UPDATE 에 대한 trigger 수행
gSQL>
UPDATE orders
SET status = 'Shipped', updated_at = SYSDATE
WHERE order_id = 1;
1 row updated.
gSQL> SELECT * FROM order_status_history;
ORDER_ID OLD_STATUS NEW_STATUS CHANGED_AT
-------- ---------------- ---------- ----------
1 Processing Order Shipped 2025-08-12
1 row selected.호환성
SQL 표준에는 정의되어 있지 않다.
참조
자세한 내용은 다음을 참조한다.
ALTER TRIGGER name RENAME TO
기능
Trigger 이름을 변경한다.
구문
<alter trigger rename statement> ::=
ALTER TRIGGER <trigger name> RENAME <new trigger name>
;사용 범위 및 접근 권한
<alter trigger rename statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 trigger의 소유자
Trigger가 속한 스키마에 대해 (ALTER TRIGGER 또는 CONTROL SCHEMA) ON SCHEMA
ALTER ANY TRIGGER ON DATABASE
구문 규칙 및 파라미터
<trigger name>
변경하려는 trigger의 이름이다. schema_name.trigger_name과 같이 trigger가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
<new trigger name>
변경하려는 trigger의 이름으로서 스키마 내에서 고유해야 한다. 새 trigger 이름의 길이는 128 바이트보다 작아야 한다.
설명
명시된 trigger의 이름을 변경한다.
사용 예
gSQL> ALTER TRIGGER t1 RENAME TO new_t1; Trigger altered.
호환성
SQL 표준에는 정의되어 있지 않다.
참조
자세한 내용은 다음을 참조한다.
CALL Statement
기능
Schema level procedure나 function을 수행한다.
구문
<call statement> ::=
<sql call statement> | <odbc procedure call escape sequence>
;
<sql call statement> ::=
CALL proc_name [ ( value_expr [ , value_expr ] .. ) ] [ INTO { '?' | { host_param [ indicator_param ] } } ]
<odbc procedure call escape sequence> ::=
'{' [ ? = ] CALL proc_name [ ( value_expr [ , value_expr ] .. ) ] '}'사용 범위 및 접근 권한
<call statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다
해당 procedure에 대한 EXECUTE 권한
Procedure가 속한 schema에 대해 (EXECUTE PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
EXECUTE ANY PROCEDURE ON DATABASE
구문 규칙 및 파라미터
proc_name
실행할 procedure/ function의 이름이다 schema_name.proc_name과 같이 procedure가 속한 schema를 포함할 수 있다.
value_expr
procedure에 전달할 인자값을 표현한다. '?' 나 ':V1'과 같은 bind parameter를 사용할 수도 있다.
설명
명시된 인자들을 사용하여 schema level SQL procedure나 function을 실행한다.
<sql call statement> 형식 중에 function은 INTO 절 다음에 host variable 표현이나 dynamic bind parameter (?)를 사용하여 결과값을 반환한다.
<odbc procedure call escape sequence> 형식은 ODBC/ JDBC 등에서 PROCEDURE를 호출하기 위한 표준 구문이며, GOLDILOCKS는 이 구문을 server에서 지원한다. (gsql 등의 tool에서도 사용 가능하다.) Function은 앞에 assign 표현( ? = )을 사용하여 결과값을 반환한다.
사용 예
Call Procedure
gSQL> CREATE OR REPLACE PROCEDURE PROC1
(
A1 INTEGER
)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('A1=' || A1);
END;
/
Procedure created.
gSQL> \var v1 INTEGER;
gSQL> \exec :v1 := 123;
gSQL> CALL PROC1(:v1);
A1=123
Procedure Call complete.Call Function
CREATE OR REPLACE FUNCTION FUNC1
(
A1 INTEGER
)
RETURN INTEGER
IS
BEGIN
return A1;
END;
/
Function created.
gSQL> \var v1 INTEGER;
gSQL> \var v2 INTEGER;
gSQL> \exec :v1 := 123;
gSQL> CALL FUNC1(:v1) INTO :v2;
Procedure Call complete.
gSQL> \print v2;
V2
---
123호환성
SQL 표준에서는 PROCEDURE에 대한 호출만 가능하여 [INTO] 절 이하를 정의하지 않고 있다.
CREATE FUNCTION
기능
Schema level function을 정의한다.
구문
<create function statement> ::=
CREATE [ OR REPLACE ] FUNCTION <function name>
[ ( <parameter list> ) ]
<return clause>
[ <function option list> ]
{ IS | AS }
<routine body>
;
<parameter list> ::=
<parameter> [ , ... ]
<parameter> ::=
<parameter name>
[ <parameter mode> ]
<datatype>
[ <parameter default> ]
<parameter mode> ::=
IN
| OUT
| IN OUT
<parameter default> ::=
{ := | DEFAULT } <value expression>
<function option list> ::=
<function option> [ ... ]
<function option> ::=
<invoker rights clause>
| <function characteristics>
<invoker rights clause> ::=
AUTHID CURRENT_USER
| AUTHID DEFINER
<function characteristics> ::=
<deterministic characteristic>
| <null-call clause>
| <SQL-data access indication>
<routine body> ::=
<SQL body>
| <external body>
<SQL body> ::=
[ <declare item> ]
<body>
<external body> ::=
<call specification>사용 범위 및 접근 권한
<create function statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.
Function을 생성하기 위해 다음 권한 중 하나가 있어야 한다.
Function이 속한 스키마에 대해 (CREATE PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
CREATE ANY PROCEDURE ON DATABASE
OR REPLACE 절을 사용할 때 이미 function이 존재할 경우, 기존 function을 제거할 수 있는 다음 권한 중 하나가 있어야 한다.
해당 function의 소유자
Function이 속한 스키마에 대해 (DROP PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY PROCEDURE ON DATABASE
구문을 수행한 사용자는 생성한 function의 소유자이다.
구문 규칙 및 파라미터
OR REPLACE
이미 function이 존재할 경우, 기존의 function을 새로운 function으로 대체한다.
function name
생성할 function의 이름으로서, 스키마 내에서 고유해야 한다. schema_name.function_name과 같이 function이 속할 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. function 이름의 길이는 128 바이트보다 작아야 한다.
parameter name
Function의 parameter 이름을 정의한다. 각 parameter 이름은 function 내에서 고유해야 한다. 즉, function의 parameter와 PL item은 동일한 이름을 가질 수 없다. Parameter 이름의 길이는 128 바이트보다 작아야 한다. 하나의 function에서 사용할 수 있는 parameter의 최대 개수에는 제한이 없다.
parameter mode
각 parameter mode를 설정한다. Parameter mode에는 IN, OUT, IN OUT이 있다. Parameter mode를 명시하지 않을 경우, 기본 mode는 IN이다.
parameter default
Parameter의 기본값이다. Parameter default가 명시된 parameter는 function을 실행할 때 생략할 수 있다. Parameter를 명시하지 않고 생략할 경우, parameter를 정의할 때 명시한 <value expression>을 기본값으로 가진다. <value expression>의 datatype은 parameter의 datatype이어야 한다. <parameter default>를 가진 parameter 이후에 정의되는 모든 parameter에는 <parameter default>가 있어야 한다.
return clause
Function의 반환 형태를 정의한다. <return clause>에서는 다음과 같이 정의된다.
RETURN <datatype>
Function에서 반환하는 반환값의 datatype을 정의한다.
RETURN TABLE ( <table function column list> )
반환하는 결과 집합의 table type을 정의한다.
table function column list
Table function이 반환하는 결과 집합의 column 이름이다. Column 이름의 길이는 128 바이트보다 작아야 한다. Column 개수에는 제한이 없다. 각 column 이름은 <table function column list>에서 고유하다. Column 이름은 parameter 및 declare item 이름과 동일할 수 있다. <table function column list>에 정의된 column은 function의 PL block 내에서 참조할 수 없다.
invoker rights clause
Function을 실행 시 참조하는 객체의 이름 해석과 권한을 생성자 (DEFINER)의 관점으로 수행할지 실행하는 사용자 (CURRENT_USER)의 관점으로 수행할지 명시한다.
AUTHID CURRENT_USER: Function을 실행하는 도중에 수행되는 SQL들은 invoker의 authorization에 따라 해석되고 수행된다.
AUTHID DEFINER: Function을 실행하는 도중에 수행되는 SQL들은 definer의 authorization에 따라 해석되고 수행된다.
<invoker rights clause>을 생략하면 기본값은 AUTHID DEFINER이다.
function characteristics
<function characteristics>은 function의 특성을 명시한다. 동일한 특성에 대해서 중복은 허용하지 않는다. 자세한 설명은 Routine Characteristics를 참조한다.
routine body
SQL body
자세한 설명은 Block (BEGIN .. END)을 참고한다.
external body
자세한 설명은 Call Specification을 참고한다.
Function의 <routine body>에는 '?'나 ':V1'과 같은 bind parameter를 사용할 수 없다.
설명
Schema-level SQL function을 정의한다. 생성된 function은 모든 expression에서 호출될 수 있다.
Function의 정의는 INFORMATION_SCHEMA의 ROUTINES 테이블에서 확인할 수 있다. Function의 parameter들에 대한 정의는 INFORMATION_SCHEMA의 PARAMETERS 테이블에서 확인할 수 있다.
관련 객체들이 존재하지 않아 function이 일시적으로 불완전해졌을 경우, ALTER FUNCTION 구문으로 plan 생성을 다시 시도해볼 수 있다.
생성된 function은 DROP FUNCTION 구문을 사용하여 제거할 수 있다. Function의 최대 생성 개수에는 제한이 없으므로 저장 공간에 문제가 없는 한 계속 생성할 수 있다.
사용 예
gSQL> CREATE OR REPLACE FUNCTION FUNC1( A1 INTEGER, A2 INTEGER )
RETURN INTEGER
IS
V1 INTEGER;
BEGIN
SELECT COUNT(*)
INTO V1
FROM T1
WHERE T1.I1 >= A1 AND T1.I1 <= A2;
RETURN V1;
END;
/
Function created.호환성
SQL 표준에서는 OR REPLACE 절을 정의하지 않고 있다.
Feature ID | 설명 | 지원여부 |
|---|---|---|
T471 | Result sets return value | X |
T341 | Overloading of SQL-invoked functions and SQL-invoked procedures | X |
S023 | Basic structured types | X |
S241 | Transform functions | X |
S024 | Enhanced structured types | X |
T571 | Array-returning external SQL-invoked functions | X |
T572 | Multiset-returning external SQL-invoked functions | X |
S201 | SQL routines on arrays | X |
S202 | SQL-invoked routines on multisets | X |
T323 | Explicit security for external routines | X |
S231 | Structured type locators | X |
S232 | Array locators | X |
S233 | Multiset locators | X |
T041 | Basic LOB data type support | X |
S027 | Create method by specific method name | X |
T041 | Basic LOB data type support | X |
T324 | Explicit security for SQL routines | O |
T326 | Table functions | O |
T651 | SQL-schema statements in SQL routines | X |
T652 | SQL-dynamic statements in SQL routines | O |
T653 | SQL-schema statements in external routines | X |
T654 | SQL-dynamic statements in external routines | X |
T655 | Cyclically dependent routines | X |
T272 | Enhanced savepoint management | X |
T522 | Default values for IN parameters of SQL-invoked procedures | O |
B121 | Routine language Ada | X |
B122 | Routine language C | O |
B123 | Routine language COBOL | X |
B124 | Routine language Fortran | X |
B125 | Routine language MUMPS | X |
B126 | Routine language Pascal | X |
B127 | Routine language PL/I | X |
B128 | Routine language SQL | O |
B129 | Routine language Ada: VARCHAR and NUMERIC support | X |
참조
자세한 내용은 다음을 참조한다.
CREATE LIBRARY
기능
C언어 프로그램의 shared library와 관련된 스키마 객체인 library를 생성한다.
구문
<create library statement> ::=
CREATE [ OR REPLACE ] LIBRARY <library name>
{ IS | AS }
'<file path name>';사용 범위 및 접근 권한
<create library statement> 구문을 수행하려면 사용자가 다음 조건을 만족해야 한다.
Library를 생성하려면 다음 권한 중 하나가 있어야 한다.
Library가 속한 스키마에 대해 (CREATE LIBRARY 또는 CONTROL SCHEMA) ON SCHEMA
CREATE ANY PACKAGE ON DATABASE
OR REPLACE 절을 명시할 경우, 기존 library를 제거하려면 다음 조건 중 하나를 만족해야 한다.
해당 library의 소유자
Library가 속한 스키마에 대해 (DROP LIBRARY 또는 CONTROL SCHEMA) ON SCHEMA
구문을 수행한 사용자는 생성한 library의 소유자이다.
구문 규칙 및 파라미터
OR REPLACE
이미 Library가 존재할 경우, 기존의 Library를 대체한다.
library name
생성하고자 하는 library의 이름이며, schema 내에서 유일한 이름이어야 한다. schema_name.library_name과 같이 library가 속할 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. Library 이름의 길이는 128 바이트보다 작아야 한다.
file path name
C언어 프로그램의 shared library의 이름 또는 full path를 명시할 수 있다.
Library를 생성할 때 file 이름만 명시한 경우, 해당 파일은 반드시 EXTLIB_DIR 프로퍼티에 설정된 폴더에 위치해야 한다. 반면, full_path를 명시한 경우에는 해당 path에 있는 shared library를 실행한다.
Cluster system에서 사용할 경우, 각 노드에서 동일한 shared library 파일을 관리해야 한다.
설명
C언어 프로그램의 shared library와 관련된 스키마 객체인 library를 생성한다. Library는 Call Specification에서 호출된다. 생성된 library는 DROP LIBRARY 구문을 사용하여 제거할 수 있다.
사용 예
file 이름만 명시
gSQL> CREATE LIBRARY lib1 AS 'add.so'; / Library created.
full path와 file 이름 명시
gSQL> CREATE LIBRARY lib2 AS '/home/user1/files/add.so'; / Library created.
호환성
SQL 표준에 정의되어 있지 않다.
참조
자세한 내용은 DROP LIBRARY를 참조한다.
CREATE PACKAGE
기능
Package 내에서 사용될 public item들에 대한 spec을 정의한다.
구문
<create package statement> ::=
CREATE [ OR REPLACE ] PACKAGE <package name>
[ <invoker rights clause> ]
{ IS | AS }
<declare item>
END [ <package name> ]
;
<invoker rights clause> ::=
AUTHID CURRENT_USER
| AUTHID DEFINER
<declare item> ::=
<variable declaration>
| <type definition>
| <explicit cursor declaration>
| <explicit cursor definition>
| <exception declaration>
| <exception init pragma>
| <procedure declaration>
| <function declaration>사용 범위 및 접근 권한
<create package statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.
Package를 생성하려면 다음 권한 중 하나가 있어야 한다.
Package가 속한 스키마에 대해 (CREATE PACKAGE 또는 CONTROL SCHEMA) ON SCHEMA
CREATE ANY PACKAGE ON DATABASE
OR REPLACE 절을 사용할 때 이미 package가 존재할 경우, 기존 package를 제거할 수 있는 다음 권한 중 하나가 있어야 한다.
해당 package의 소유자
Package가 속한 스키마에 대해 (DROP PACKAGE 또는 CONTROL SCHEMA) ON SCHEMA
구문을 수행한 사용자는 생성한 package의 소유자이다.
구문 규칙 및 파라미터
OR REPLACE
이미 package가 존재할 경우, 기존의 package specification을 대체한다.
PACKAGE NAME
생성할 package의 이름이며, schema 내에서 유일한 이름이어야 한다. schema_name.package_name과 같이 package가 속할 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. Package 이름의 길이는 128 바이트보다 작아야 한다.
invoker rights clause
Package를 실행 시 참조하는 객체의 이름 해석 및 권한을 생성자 (DEFINER)의 관점으로 수행할지 실행하는 사용자 (CURRENT_USER)의 관점으로 수행할지 명시한다.
AUTHID CURRENT_USER: Package를 실행하는 도중에 수행되는 SQL들은 invoker의 authorization에 따라 해석되고 수행된다.
AUTHID DEFINER: Package를 실행하는 도중에 수행되는 SQL들은 definer의 authorization에 따라 해석되고 수행된다.
<invoker rights clause>을 생략하면 기본값은 AUTHID DEFINER이다.
declare item
Package 외부에서 접근 가능한 item을 선언한다. 이를 public package item이라고 한다. Package Spec에서 선언한 function과 procedure는 반드시 create package body 구문에서 정의해야 한다. Package Spec에서 SQL 없이 선언만 된 Explicit Cursor는 반드시 create package body 구문에서 정의해야 한다. 선언할 수 있는 item에 대한 자세한 내용은 Block (BEGIN .. END)의 declare item을 참조한다.
설명
Schema-level package specification을 생성한다. Package 생성 정보는 INFORMATION_SCHEMA.MODULES 테이블에서 확인할 수 있다. Package 내의 공개된 각 procedure 및 function 목록은 INFORMATION_SCHEMA.ROUTINES 테이블에서 확인할 수 있다. Package 내의 공개된 각 procedure 및 function의 parameter들에 대한 정의는 INFORMATION_SCHEMA.PARAMETERS 테이블에서 확인할 수 있다.
생성된 package의 모든 public package item은 다른 PSM 객체나 anonymous block에서 참조할 수 있다.
Package가 참조하는 객체의 상태가 변경되어 package가 invalid 상태가 되었다면, 아래의 구문으로 recompile이 가능하다.
ALTER PACKAGE <package name> COMPILE
ALTER PACKAGE <package name> COMPILE SPECIFICATION
사용 예
CREATE OR REPLACE PACKAGE PKG1 IS V1 INTEGER; PROCEDURE PROC1; FUNCTION FUNC1 RETURN INTEGER; END; / Package created.
호환성
SQL 표준에서는 CREATE MODULE 구문이다.
참조
자세한 내용은 다음을 참조한다.
CREATE PACKAGE BODY
기능
Package 내에서 사용될 procedure, function 및 커서들에 대한 정의를 생성한다.
구문
<create package body statement> ::=
CREATE [ OR REPLACE ] PACKAGE BODY <package name>
{ IS | AS }
<declare item>
[ <initialization part> ]
END [ <package name> ]
;
<declare item> ::=
<variable declaration>
| <type definition>
| <explicit cursor declaration>
| <explicit cursor definition>
| <exception declaration>
| <exception init pragma>
| <procedure declaration>
| <procedure definition>
| <function declaration>
| <function definition>
<initialization part> ::=
BEGIN
<pl statement list>
[ <exception block> ]사용 범위 및 접근 권한
<create package body statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.
Package body를 생성하려면 다음 권한 중 하나가 있어야 한다.
Package가 속한 스키마에 대해 (CREATE PACKAGE 또는 CONTROL SCHEMA) ON SCHEMA
CREATE ANY PACKAGE ON DATABASE
Package spec이 이미 정의되어 있는 상태이어야 한다.
OR REPLACE 절을 사용할 때 package body가 이미 존재할 경우, 기존 package를 제거할 수 있는 다음 권한 중 하나가 있어야 한다.
해당 package의 소유자
Package가 속한 스키마에 대해 (DROP PACKAGE 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY PACKAGE ON DATABASE
구문을 수행한 사용자는 생성한 package의 소유자이다.
구문 규칙 및 파라미터
OR REPLACE
Package body가 이미 존재할 경우, 기존의 package body definition을 대체한다.
PACKAGE NAME
생성할 package body의 이름이며, package spec 생성에 사용된 동일한 이름을 사용해야 한다. schema 내에서 유일한 이름이어야 한다. schema_name.package_name 과 같이 package가 속할 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. Package 이름의 길이는 128 바이트보다 작아야 한다.
declare item
Package body에서 사용할 item을 선언한다. 이를 private package item이라고 한다. private package item은 public package item과 중복된 이름을 가질 수 없다. Package spec에서 선언된 routine들은 반드시 package body에서 정의해야 한다. Package spec에서 SQL 없이 선언만 된 커서들은 반드시 package body에 정의해야 한다. 선언할 수 있는 item에 대한 자세한 내용은 Block (BEGIN .. END)에서 declare item을 참조한다.
Initialization Part
Package instance 생성 과정에서 내부 변수등의 초기화를 위해 한 번만 수행되는 구문들을 기술한다. 각 구문에 대한 자세한 설명은 Block (BEGIN .. END)의 pl statement를 참조한다.
설명
Schema-level package body를 생성한다. Package body의 생성 정보는 INFORMATION_SCHEMA.MODULE_BODY 테이블에서 확인할 수 있다.
생성된 package body에서 선언한 private package item은 다른 PSM 객체나 anonymous block에서 참조할 수 없다.
Package body가 참조하는 객체의 상태가 변경되어 package body가 invalid 상태가 되었다면, 아래의 구문으로 recompile이 가능하다.
ALTER PACKAGE <package name> COMPILE
ALTER PACKAGE <package name> COMPILE BODY
생성된 package body는 아래의 구문으로 삭제할 수 있다.
DROP PACKAGE <package name>
DROP PACKAGE BODY <package name>
사용 예
CREATE OR REPLACE PACKAGE PKG1
IS
V1 INTEGER;
PROCEDURE PROC1;
FUNCTION FUNC1 RETURN INTEGER;
END;
/
Package created.
CREATE OR REPLACE PACKAGE BODY PKG1
IS
FUNCTION FUNC1 RETURN INTEGER
IS
BEGIN
RETURN V1;
END;
PROCEDURE PROC1
IS
BEGIN
IF V1 IS NULL
THEN
V1 := 10;
ELSE
V1 := V1 + 10;
END IF;
END;
END;
/
Package created.호환성
SQL 표준에는 정의되어 있지 않다.
참조
자세한 내용은 다음을 참조한다.
CREATE PROCEDURE
기능
Schema-level procedure를 정의한다.
구문
<create procedure statement> ::=
CREATE [ OR REPLACE ] PROCEDURE <procedure name>
[ ( <parameter list> ) ]
[ <procedure option list> ]
{ IS | AS }
<routine body>
;
<parameter list> ::=
<parameter> [ , ... ]
<parameter> ::=
<parameter name>
[ <parameter mode> ]
<datatype>
[ <parameter default> ]
<parameter mode> ::=
IN
| OUT
| IN OUT
<parameter default> ::=
{ := | DEFAULT } <value expression>
<procedure option list> ::=
<procedure option> [ ... ]
<procedure option> ::=
<invoker rights clause>
| <procedure characteristics>
<invoker rights clause> ::=
AUTHID CURRENT_USER
| AUTHID DEFINER
<procedure characteristics> ::=
<deterministic characteristic>
| <SQL-data access indication>
<routine body> ::=
<SQL body>
| <external body>
<SQL body> ::=
[ <declare item> ]
<body>
<external body> ::=
<call specification>사용 범위 및 접근 권한
<create procedure statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.
Procedure를 생성하려면 다음 권한 중 하나가 있어야 한다.
Procedure가 속한 스키마에 대해 (CREATE PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
CREATE ANY PROCEDURE ON DATABASE
OR REPLACE 절을 사용할 때 이미 procedure가 존재할 경우, 기존 procedure를 제거할 수 있는 다음 권한 중 하나가 있어야 한다.
해당 procedure의 소유자
Procedure가 속한 스키마에 대해 (DROP PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY PROCEDURE ON DATABASE
구문을 수행한 사용자는 생성한 procedure의 소유자이다.
구문 규칙 및 파라미터
OR REPLACE
이미 procedure가 존재할 경우, 기존의 procedure를 새로운 procedure로 대체한다.
procedure name
생성할 procedure의 이름으로서 스키마 내에서 고유해야 한다. schema_name.procedure_name과 같이 procedure가 속할 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. procedure 이름의 길이는 128 바이트보다 작아야 한다.
parameter name
Procedure의 parameter 이름을 정의한다. 각 parameter 이름은 procedure 내에서 고유해야 한다. 즉, procedure의 parameter와 PL item은 동일한 이름을 가질 수 없다. parameter 이름의 길이는 128 바이트보다 작아야 한다. 하나의 procedure에서 사용할 수 있는 parameter의 최대 개수에는 제한이 없다.
parameter mode
각 parameter mode를 설정한다. Parameter mode에는 IN, OUT, IN OUT이 있다. Parameter mode를 명시하지 않을 경우, 기본 mode는 IN이다.
parameter default
Parameter의 기본값이다. Parameter default가 명시된 parameter는 procedure 실행할 때 생략할 수 있다. Parameter를 명시하지 않고 생략할 경우, parameter를 정의할 때 명시한 <value expression>을 기본값으로 가진다. <value expression>의 datatype은 parameter의 datatype이어야 한다. <parameter default>를 가진 parameter 이후에 정의되는 모든 parameter에는 <parameter default>가 있어야 한다.
invoker rights clause
Procedure를 실행할 때 참조하는 객체의 이름 해석 및 권한을 생성자 (DEFINER)의 관점으로 수행할지 실행하는 사용자 (CURRENT_USER)의 관점으로 수행할지 명시한다.
AUTHID CURRENT_USER: Procedure를 실행하는 도중에 수행되는 SQL들은 invoker의 authorization에 따라 해석되고 수행된다.
AUTHID DEFINER: Procedure를 실행하는 도중에 수행되는 SQL들은 definer의 authorization에 따라 해석되고 수행된다.
<invoker rights clause>을 생략하면 기본값은 AUTHID DEFINER이다.
procedure characteristics
<procedure characteristics>은 procedure의 특성을 명시한다. 동일한 특성에 대해서 중복은 허용하지 않는다. 자세한 설명은 Routine Characteristics를 참고한다.
routine body
SQL body
자세한 설명은 Block (BEGIN .. END)을 참고한다.
external body
자세한 설명은 Call Specification을 참고한다.
Procedure의 <routine body>에는 '?'나 ':V1'과 같은 bind parameter를 사용할 수 없다.
설명
Schema-level SQL procedure를 정의한다. 생성된 procedure는 CALL 구문, anonymous block, 또는 다른 procedure/ function에서 호출될 수 있다.
Procedure의 정의는 INFORMATION_SCHEMA의 ROUTINES 테이블에서 확인할 수 있다. Procedure의 parameter들에 대한 정의는 INFORMATION_SCHEMA의 PARAMETERS 테이블에서 확인할 수 있다.
관련 객체들이 존재하지 않아 procedure가 일시적으로 불완전해졌을 경우, ALTER PROCEDURE 구문으로 plan 생성을 다시 시도해볼 수 있다.
생성된 procedure는 DROP PROCEDURE 구문을 사용하여 제거할 수 있다. Procedure의 최대 생성 개수에는 제한이 없으므로 저장 공간에 문제가 없는 한 계속 생성할 수 있다.
사용 예
gSQL> CREATE OR REPLACE PROCEDURE PROC1( A1 INTEGER, A2 INTEGER )
IS
V1 INTEGER;
BEGIN
SELECT COUNT(*)
INTO V1
FROM T1
WHERE T1.I1 >= A1 AND T1.I1 <= A2;
DBMS_OUTPUT.PUT_LINE( 'V1 = ' || V1 );
END;
/
Procedure created.호환성
SQL 표준에서는 다음과 같은 절을 정의하지 않고 있다.
Feature ID | 설명 | 지원여부 |
|---|---|---|
T471 | Result sets return value | X |
T341 | Overloading of SQL-invoked functions and SQL-invoked procedures | X |
S023 | Basic structured types | X |
S241 | Transform functions | X |
S024 | Enhanced structured types | X |
T571 | Array-returning external SQL-invoked functions | X |
T572 | Multiset-returning external SQL-invoked functions | X |
S201 | SQL routines on arrays | X |
S202 | SQL-invoked routines on multisets | X |
T323 | Explicit security for external routines | X |
S231 | Structured type locators | X |
S232 | Array locators | X |
S233 | Multiset locators | X |
T041 | Basic LOB data type support | X |
S027 | Create method by specific method name | X |
T041 | Basic LOB data type support | X |
T324 | Explicit security for SQL routines | O |
T326 | Table functions | O |
T651 | SQL-schema statements in SQL routines | X |
T652 | SQL-dynamic statements in SQL routines | O |
T653 | SQL-schema statements in external routines | X |
T654 | SQL-dynamic statements in external routines | X |
T655 | Cyclically dependent routines | X |
T272 | Enhanced savepoint management | X |
T522 | Default values for IN parameters of SQL-invoked procedures | O |
B121 | Routine language Ada | X |
B122 | Routine language C | O |
B123 | Routine language COBOL | X |
B124 | Routine language Fortran | X |
B125 | Routine language MUMPS | X |
B126 | Routine language Pascal | X |
B127 | Routine language PL/I | X |
B128 | Routine language SQL | O |
B129 | Routine language Ada: VARCHAR and NUMERIC support | X |
참조
자세한 내용은 다음을 참조한다.
CREATE TRIGGER
기능
Trigger를 생성한다.
구문
<create trigger statement> ::=
CREATE [ OR REPLACE ] TRIGGER <trigger name>
<trigger action time>
<trigger event list> ON <table name>
[ REFERENCING <transition table or variable list> ]
<triggered action>
;
<trigger action time> ::=
BEFORE
| AFTER
<trigger event list> ::=
<trigger event> [ OR <trigger event> [ ... ] ]
<trigger event> ::=
INSERT
| DELETE
| UPDATE [ OF <trigger column list> ]
<trigger column list> ::=
<column name list>
<column name list> ::=
<column name> [ { <comma> <column name> }... ]
<transition table or variable list> ::=
OLD [ ROW ] [ AS ] <old transition variable name>
| NEW [ ROW ] [ AS ] <new transition variable name>
| OLD TABLE [ AS ] <old transition table name>
| NEW TABLE [ AS ] <new transition table name>
<triggered action> ::=
[ FOR EACH { ROW | STATEMENT } ]
[ <trigger enforcement> ]
[ <triggered when clause> ]
<trigger body>
<trigger enforcement> ::=
ENABLE
| DISABLE
| ENFORCED
| NOT ENFORCED
<triggered when clause> ::=
WHEN <left paren> <search condition> <right paren>
<trigger body> ::=
<PSM block>
| CALL <procedure name>사용 범위 및 접근 권한
<create trigger statement> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.
Trigger를 생성하려면 다음 권한 중 하나가 있어야 한다.
Trigger가 속한 스키마에 대해 (CREATE TRIGGER 또는 CONTROL SCHEMA) ON SCHEMA
CREATE ANY TRIGGER ON DATABASE
OR REPLACE 절을 사용할 때 이미 trigger가 존재할 경우, 기존 trigger를 제거할 수 있는 다음 권한 중 하나가 있어야 한다.
해당 trigger의 소유자
Trigger가 속한 스키마에 대해 (DROP TRIGGER 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY TRIGGER ON DATABASE
Trigger는 table에 대해 TRIGGER 권한이 있어야 한다.
구문을 수행한 사용자는 생성한 trigger의 소유자이다.
구문 규칙 및 파라미터
OR REPLACE
기존에 동일한 trigger가 존재할 경우, 기존 trigger를 새로운 trigger로 대체한다.
<trigger name>
생성할 trigger의 이름으로서, 스키마 내에서 고유해야 한다. schema_name.trigger_name과 같이 trigger가 속할 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다. Trigger 이름의 길이는 128 바이트보다 작아야 한다.
<trigger action time>
Trigger가 수행되는 시점을 정의한다.
BEFORE
DML이 수행되기 전에 trigger가 수행된다.
AFTER
DML을 수행한 후에 trigger가 수행된다.
<trigger event>
Event table에서 발생한 DML에 따라 trigger 실행 여부를 결정한다. 하나 이상의 <trigger event>를 지정할 수 있다. 동일한 <trigger event>를 중복해서 지정할 수 없다.
<trigger event>의 종류는 다음과 같다.
INSERT
지정된 event table에서 INSERT 문이 수행되면 trigger가 실행된다.
UPDATE [ OF <trigger column list> ]
지정된 event table에서 UPDATE 문이 수행되면 trigger가 실행된다.
OF <trigger column list>를 지정하면, 명시된 column이 UPDATE 될 때만 trigger가 실행된다.
DELETE
지정된 event table에서 DELETE 문이 수행되면 trigger가 실행된다.
<trigger column list>
지정된 특정 column이 UPDATE 될 때만 trigger가 실행되도록 설정하는 구문이다. Column 이름은 중복해서 지정할 수 없다. 명시된 모든 column은 event table에 실제로 존재해야 한다.
<table name>
Trigger가 감지할 DML 이벤트의 대상이 되는 base table 객체의 이름이다. Base table 이름에는 schema_name.table_name과 같이 스키마 이름을 지정할 수 있다. 스키마 이름을 생략할 경우 구문을 수행하는 사용자의 기본 스키마 이름을 사용한다.
REFERENCING <transition table or variable list>
REFERENCING transition table과 transition variable은 trigger에서 DML 수행 전후의 데이터를 참조하기 위해 사용된다.
REFERENCING 구문 뒤에는 다음과 같이 선언할 수 있으며, 중복 선언은 허용되지 않는다.
OLD transition table
UPDATE 또는 DELETE가 수행되기 이전의 원본 데이터를 참조할 수 있는 임시 테이블이다.
NEW transition table
INSERT 또는 UPDATE가 수행된 이후의 새로운 데이터를 참조할 수 있는 임시 테이블이다.
OLD transition variable
UPDATE 또는 DELETE가 수행되기 이전의 개별 row 데이터를 참조할 수 있는 변수이다.
NEW transition variable
INSERT 또는 UPDATE가 수행된 이후의 개별 row 데이터를 참조할 수 있는 변수이다.
OLD transition table, NEW transition table, OLD transition variable, NEW transition variable 이름은 중복해서 지정할 수 없다. 사용자가 선언한 transition table 또는 transition varible은 <triggered action> 내에서만 사용할 수 있다.
Transition table
DML 수행으로 변경된 row들의 집합을 table 형태로 제공한다.
BEFORE trigger에서는 선언할 수 없다.
다중 이벤트 trigger에서는 선언할 수 없다.
Transition variable
Statement trigger에서는 선언할 수 없다.
<trigger event>가 INSERT인 trigger에서는 OLD transition variable을 선언할 수 없다.
<trigger event>가 DELETE인 trigger에서는 NEW transition variable을 선언할 수 없다.
INSERT를 포함하는 다중 이벤트 trigger에서 INSERT 실행으로 trigger가 발생하는 경우, OLD transition variable은 NULL이다.
DELETE를 포함하는 다중 이벤트 trigger에서 DELETE 실행으로 trigger가 발생하는 경우, NEW transition variable은 NULL이다.
FOR EACH ROW/ FOR EACH STATEMENT
Trigger의 실행 단위를 지정한다. 별도로 지정하지 않으면, 기본적으로 FOR EACH STATEMENT로 동작한다.
FOR EACH ROW
DML 실행에 영향을 받은 각 row 마다 실행된다.
FOR EACH STATEMENT
DML이 실행될 때 한 번만 실행된다.
<trigger enforcement>
Trigger를 활성화된 상태로 생성할지, 비활성화된 상태로 생성할지를 지정한다. 별도로 지정하지 않으면 trigger는 기본적으로 활성화된 상태로 생성된다.
ENABLE 과 ENFORCED 는 동일한 의미이다. DISABLE 과 NOT ENFORCED 는 동일한 의미이다.
ENABLE
Event table에서 DML이 발생할 경우 trigger를 활성화한다.
DML event 발생 시 trigger가 실행된다.
DISABLE
Event table에서 DML이 발생할 경우, trigger를 비활성화한다.
DML event 발생 시 trigger가 실행되지 않는다.
<triggered when clause>
Trigger 실행 여부를 제어하는 조건절을 지정한다.
<triggered when clause>의 결과가 true이면 trigger가 실행되고, false이면 실행되지 않는다. <triggered when clause>를 지정하지 않으면 trigger는 항상 실행된다.
<triggered when clause>의 expression에서 function을 사용할 수 있으나, 해당 function은 MODIFIES SQL DATA 속성을 가져서는 안 된다.
<trigger body>
Trigger가 실행할 구문을 정의한다. 이는 PSM block 또는 CALL 구문으로 구성된다.
설명
Trigger를 정의하면, 지정된 base table에서 DML event가 발생할 때 해당 trigger가 실행된다. Trigger의 정의는 INFORMATION_SCHEMA의 TRIGGERS 테이블에서 확인할 수 있다.
관련 객체가 변경되어 trigger가 invalid 상태가 된 경우, ALTER TRIGGER .. COMPILE 구문을 사용하여 recompile 할 수 있다.
또한, ALTER TRIGGER .. RENAME 구문을 통해 생성된 trigger의 이름을 변경할 수 있다.
아래 구문을 실행하여 trigger의 활성화 상태를 변경할 수 있다.
ALTER TRIGGER .. ENABLE
ALTER TRIGGER .. ENFORCED
Trigger를 활성화 상태로 변경한다.
ALTER TRIGGER .. DISABLE
ALTER TRIGGER .. NOT ENFORCED
Trigger를 비활성화 상태로 변경한다.
생성된 trigger는 DROP TRIGGER 구문을 사용하여 제거할 수 있다. 또한, event table 객체가 제거되면 해당 trigger도 함께 제거된다.
사용 예
Trigger 생성 및 실행 예
Table 생성
-- 시스템 로그 테이블
gSQL>
CREATE TABLE system_log( log_time DATE,
action VARCHAR2(100),
table_name VARCHAR2(50) );
Table created.
-- 주문 상태 이력 테이블
gSQL>
CREATE TABLE order_status_history( order_id NUMBER,
old_status VARCHAR2(20),
new_status VARCHAR2(20),
changed_at DATE );
Table created.
-- 관리자 알림 테이블
gSQL>
CREATE TABLE admin_notifications( message VARCHAR2(200),
created_at DATE );
Table created.
-- ORDERS 테이블
gSQL>
CREATE TABLE orders( order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
amount NUMBER,
status VARCHAR2(20),
created_at DATE,
updated_at DATE );
Table created.N/A
Trigger 생성
-- DML 시도 logging
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_check_before_stmt
BEFORE INSERT OR UPDATE OR DELETE ON orders
DECLARE
dml_event VARCHAR(10);
BEGIN
IF INSERTING THEN
dml_event := 'INSERT';
END IF;
IF UPDATING THEN
dml_event := 'UPDATE';
END IF;
IF DELETING THEN
dml_event := 'DELETE';
END IF;
INSERT INTO system_log VALUES( SYSDATE, dml_event, 'ORDERS' );
END;
/
Trigger created.
-- INSERT 시 created_at 자동 설정
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_set_created_at
BEFORE INSERT ON orders
REFERENCING NEW ROW AS n_row
FOR EACH ROW
BEGIN
n_row.created_at := NVL(n_row.created_at, SYSDATE);
END;
/
Trigger created.
-- 상태 변경 시 이력 저장
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_status_audit
AFTER UPDATE OF status ON orders
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
WHEN( o_row.status IS DISTINCT FROM n_row.status )
BEGIN
INSERT INTO order_status_history VALUES (o_row.order_id, o_row.status, n_row.status, SYSDATE);
END;
/
Trigger created.
-- 상태 변경 후 알림
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_bulk_update_log
AFTER UPDATE ON orders
BEGIN
INSERT INTO admin_notifications VALUES ('Order status in the ORDERS table has been updated.', SYSDATE);
END;
/
Trigger created.N/A
DML 수행
-- INSERT 시 BEFORE STATEMENT, BEFORE ROW 트리거 동작
gSQL>
INSERT INTO orders (order_id, customer_id, amount, status)
VALUES (1, 1001, 50000, 'Order Received ');
1 row created.
gSQL> SELECT * FROM system_log;
LOG_TIME ACTION TABLE_NAME
---------- ------ ----------
2025-08-08 INSERT ORDERS
1 row selected.
gSQL> SELECT * FROM orders;
ORDER_ID CUSTOMER_ID AMOUNT STATUS CREATED_AT UPDATED_AT
-------- ----------- ------ --------------- ---------- ----------
1 1001 50000 Order Received 2025-08-13 null
1 row selected.
-- UPDATE 시 BEFORE STATEMENT, AFTER ROW, AFTER STATEMENT 트리거 동작
gSQL>
UPDATE orders
SET status = 'Shipped', updated_at = SYSDATE
WHERE order_id = 1;
1 row updated.
gSQL> SELECT * FROM system_log;
LOG_TIME ACTION TABLE_NAME
---------- ------ ----------
2025-08-08 INSERT ORDERS
2025-08-08 UPDATE ORDERS
2 rows selected.
gSQL> SELECT * FROM order_status_history;
ORDER_ID OLD_STATUS NEW_STATUS CHANGED_AT
-------- --------------- ---------- ----------
1 Order Received Shipped 2025-08-13
1 row selected.
gSQL> SELECT * FROM admin_notifications;
MESSAGE CREATED_AT
-------------------------------------------------- ----------
Order status in the ORDERS table has been updated. 2025-08-13
1 row selected.
gSQL> SELECT * FROM orders;
ORDER_ID CUSTOMER_ID AMOUNT STATUS CREATED_AT UPDATED_AT
-------- ----------- ------ ------- ---------- ----------
1 1001 50000 Shipped 2025-08-13 2025-08-13
1 row selected.<trigger body> 에 CALL 구문을 사용한 예
Table 생성
gSQL>
CREATE TABLE employees( emp_id NUMBER PRIMARY KEY,
name VARCHAR2(50),
salary NUMBER );
Table created.
gSQL> INSERT INTO employees VALUES (1001, 'Alice', 5000);
1 row created.
gSQL> INSERT INTO employees VALUES (1002, 'Bob', 6000);
1 row created.
gSQL> COMMIT;
Commit complete.
gSQL>
CREATE TABLE audit_log( EMP_ID NUMBER,
OLD_SALARY NUMBER,
NEW_SALARY NUMBER,
CHANGED_AT TIMESTAMP );
Table created.N/A
Procedure 및 trigger 생성
gSQL>
CREATE OR REPLACE PROCEDURE log_salary_change(
p_emp_id IN NUMBER,
p_old_salary IN NUMBER,
p_new_salary IN NUMBER )
AS
BEGIN
INSERT INTO audit_log VALUES( p_emp_id,
p_old_salary,
p_new_salary,
SYSTIMESTAMP );
END;
/
Procedure created.
gSQL>
CREATE OR REPLACE TRIGGER trg_log_salary_change
AFTER UPDATE OF salary ON employees
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
CALL log_salary_change( o_row.emp_id, o_row.salary, n_row.salary );
/
Trigger created.N/A
DML 수행
gSQL> UPDATE employees SET salary = 5500 WHERE emp_id = 1001; 1 row updated. gSQL> SELECT * FROM audit_log; EMP_ID OLD_SALARY NEW_SALARY CHANGED_AT ------ ---------- ---------- -------------------------- 1001 5000 5500 2025-08-08 17:21:35.522820 1 row selected.
<triggered when clause> 사용 예
Table 생성
gSQL>
CREATE TABLE employees( emp_id INTEGER PRIMARY KEY,
name VARCHAR(100),
salary INTEGER );
Table created.
gSQL> INSERT INTO employees VALUES( 101, 'Alice', 8000 );
1 row created.
gSQL> COMMIT;
Commit complete.
gSQL>
CREATE TABLE salary_log( emp_id INTEGER,
old_salary INTEGER,
new_salary INTEGER,
log_time TIMESTAMP );
Table created.
gSQL> COMMIT;
Commit complete.N/A
Trigger 생성
gSQL>
CREATE OR REPLACE TRIGGER trg_log_high_salary
AFTER UPDATE ON employees
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
WHEN( n_row.salary >= 10000 AND n_row.salary > o_row.salary )
BEGIN
INSERT INTO salary_log VALUES( o_row.emp_id,
o_row.salary,
n_row.salary,
CURRENT_TIMESTAMP );
END;
/
Trigger created.N/A
DML 수행 시 trigger 동작
-- WHEN 절 조건을 만족하지 않는 경우 → Trigger 본문이 실행되지 않음 gSQL> UPDATE employees SET salary = 9000; 1 row updated. gSQL> SELECT * FROM salary_log; no rows selected.
-- WHEN 절 조건을 만족하는 경우 → Trigger 본문이 실행됨 gSQL> UPDATE employees SET salary = 12000; 1 row updated. gSQL> SELECT * FROM salary_log; EMP_ID OLD_SALARY NEW_SALARY LOG_TIME ------ ---------- ---------- -------------------------- 101 8000 12000 2025-08-08 17:39:38.391413 1 row selected.
호환성
Feature ID | 설명 | 지원 여부 |
|---|---|---|
T200 | Trigger DDL | O |
T211 | Basic trigger capability | O |
T212 | Enhanced trigger capability | O |
T213 | INSTEAD OF triggers | X |
T214 | BEFORE triggers | O |
T215 | AFTER triggers | O |
T216 | Ability to require true search condition before trigger is invoked | O |
T217 | TRIGGER privilege | O |
T218 | Multiple triggers for the same event executed in the order created | O |
참조
자세한 내용은 다음을 참조한다.
DROP FUNCTION
기능
Function을 제거한다.
구문
<drop function statement> ::=
DROP FUNCTION [ IF EXISTS ] func_name
;사용 범위 및 접근 권한
<drop function statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 function의 소유자
Function이 속한 스키마에 대해 (DROP PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY PROCEDURE ON DATABASE
구문 규칙 및 파라미터
IF EXISTS
Function이 존재하지 않더라도 에러가 발생하지 않는다.
FUNC NAME
제거할 function의 이름이다. schema_name.func_name과 같이 function이 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
지정된 schema-level function을 제거한다.
사용 예
gSQL> CREATE OR REPLACE FUNCTION FUNC1
RETURN INTEGER
IS
V1 INTEGER;
BEGIN
V1 := 10;
RETURN V1;
END;
/
Function created.
COMMIT;
Commit complete.
gSQL> DROP FUNCTION FUNC1;
Function dropped.호환성
SQL 표준은 다음과 같은 절을 정의하지 않고 있다.
Feature ID | 설명 | 지원 여부 |
|---|---|---|
F032 | CASCADE drop behavior | X |
S024 | Enhanced structured types | X |
참조
자세한 내용은 다음을 참조한다.
DROP LIBRARY
기능
Library를 제거한다.
구문
<drop library statement> ::=
DROP LIBRARY [ IF EXISTS ] <library name>
;사용 범위 및 접근 권한
<drop library statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 library의 소유자
library가 속한 스키마에 대해 DROP LIBRARY ON SCHEMA 또는 CONTROL SCHEMA ON SCHEMA
DROP ANY LIBRARY ON DATABASE
구문 규칙 및 파라미터
IF EXISTS
Library가 존재하지 않더라도 에러가 발생하지 않는다.
library name
제거할 library의 이름이다. <schema name>.<library name>과 같이 library가 속한 스키마를 정의할 수 있다. <schema name>을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
지정된 library를 제거한다.
사용 예
gSQL> CREATE LIBRARY lib1 AS 'add.so'; / Library created. gSQL> DROP LIBRARY lib1; Library dropped. gSQL> DROP LIBRARY IF EXISTS lib2; Library dropped.
호환성
SQL 표준에 정의되어 있지 않다.
참조
자세한 내용은 CREATE LIBRARY를 참조한다.
DROP PACKAGE
기능
Package (body만 또는 spec/ body 모두)를 제거한다.
구문
<drop package statement> ::=
DROP PACKAGE [BODY] [ IF EXISTS ] package_name
;사용 범위 및 접근 권한
<drop package statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 package의 소유자
Package가 속한 스키마에 대해 (DROP PACKAGE 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY PACKAGE ON DATABASE
구문 규칙 및 파라미터
BODY
주어진 이름을 가진 package의 body 객체만 제거한다. BODY 라는 키워드를 명시하지 않은 경우 package specification과 body를 모두 삭제한다.
IF EXISTS
Package가 존재하지 않더라도 에러가 발생하지 않는다.
PACKAGE NAME
제거할 package의 이름이다. schema_name.package_name 과 같이 package가 소속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
지정된 package object를 제거한다.
사용 예
CREATE PACKAGE PKG1
IS
V1 INTEGER;
FUNCTION FUNC1 (A1 INTEGER) RETURN INTEGER;
END;
/
Package created.
DROP PACKAGE IF EXISTS PKG1;
Package dropped.호환성
SQL 표준에서는 DRO MODULE 구문이다.
참조
자세한 내용은 다음을 참조한다.
DROP PROCEDURE
기능
Procedure를 제거한다.
구문
<drop procedure statement> ::=
DROP PROCEDURE [ IF EXISTS ] proc_name
;사용 범위 및 접근 권한
<drop procedure statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 procedure의 소유자
Procedure가 속한 스키마에 대해 (DROP PROCEDURE 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY PROCEDURE ON DATABASE
구문 규칙 및 파라미터
IF EXISTS
Procedure가 존재하지 않더라도 에러가 발생하지 않는다.
PROC NAME
제거할 procedure의 이름이다. schema_name.proc_name과 같이 procedure가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
지정된 schema-level procedure를 제거한다.
사용 예
gSQL> CREATE OR REPLACE PROCEDURE PROC1( A1 INTEGER, A2 INTEGER )
IS
V1 INTEGER;
BEGIN
SELECT COUNT(*)
INTO V1
FROM T1
WHERE T1.I1 >= A1 AND T1.I1 <= A2;
DBMS_OUTPUT.PUT_LINE( 'V1 = ' || V1 );
END;
/
Procedure created.
COMMIT;
Commit complete.
gSQL> DROP PROCEDURE PROC1;
Procedure dropped.호환성
SQL 표준은 다음과 같은 절을 정의하지 않고 있다.
Feature ID | 설명 | 지원 여부 |
|---|---|---|
F032 | CASCADE drop behavior | X |
S024 | Enhanced structured types | X |
참조
자세한 내용은 다음을 참조한다.
DROP TRIGGER
기능
Trigger를 제거한다.
구문
<drop trigger statement> ::=
DROP TRIGGER [ IF EXISTS ] <trigger name>
;사용 범위 및 접근 권한
<drop trigger statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.
해당 trigger의 소유자
Trigger가 속한 스키마에 대해 (DROP TRIGGER 또는 CONTROL SCHEMA) ON SCHEMA
DROP ANY TRIGGER ON DATABASE
구문 규칙 및 파라미터
IF EXISTS
Trigger가 존재하지 않더라도 에러가 발생하지 않는다.
<trigger name>
제거할 trigger 이름이다. schema_name.trigger_name과 같이 trigger가 속한 스키마를 정의할 수 있다. schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
설명
명시된 trigger를 제거한다. 또한, DROP TABLE로 event table이 제거되면 해당 trigger도 함께 제거된다.
사용 예
gSQL>
CREATE OR REPLACE TRIGGER trg_orders_status_audit
AFTER UPDATE OF status ON orders
REFERENCING OLD ROW AS o_row
NEW ROW AS n_row
FOR EACH ROW
WHEN( o_row.status IS DISTINCT FROM n_row.status )
BEGIN
INSERT INTO order_status_history VALUES (o_row.order_id, o_row.status, n_row.status, SYSDATE);
END;
/
Trigger created.
gSQL> DROP TRIGGER trg_orders_status_audit;
Trigger dropped.호환성
Feature ID | 설명 | 지원 여부 |
|---|---|---|
T200 | Trigger DDL | O |
참조
자세한 내용은 다음을 참조한다.