PSM SQL References

ALTER FUNCTION

기능

Function을 recompile 한다.

구문

<alter function statement> ::=
    ALTER FUNCTION function_name COMPILE
    ;

사용 범위 및 접근 권한

<alter function statement> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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을 다시 생성하는 구문이다.

SQL 표준 호환성

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_name

Compile 할 package의 이름이다.
schema_name.package_name과 같이 package가 속한 스키마를 정의할 수 있다.
schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

<package compile clause>

Package를 compile 할 대상을 지정한다.
만약 대상을 생략하면, PACKAGE를 지정한 것과 동일하게 package specification 과 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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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을 다시 생성하는 구문이다.

SQL 표준 호환성

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 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 name>

활성화 상태를 변경하려는 trigger의 이름이다.
schema_name.trigger_name과 같이 trigger가 속한 스키마를 정의할 수 있다.
schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.

<trigger enforcement>

ENABLE 과 ENFORCED 는 동일한 의미이다.
DISABLE 과 NOT ENFORCED 는 동일한 의미이다.

설명

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.
-- 비활성화 상태인 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 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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다

구문 규칙 및 파라미터

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> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

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>에서는 다음과 같이 정의된다.

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)의 관점으로 수행할지 명시한다.
<invoker rights clause>을 생략하면 기본값은 AUTHID DEFINER이다.

function characteristics

<function characteristics>은 function의 특성을 명시한다.
동일한 특성에 대해서 중복은 허용하지 않는다.
자세한 설명은 Routine Characteristics를 참조한다.

routine body

설명

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 절을 정의하지 않고 있다.

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 LIBRARY

기능

C언어 프로그램의 shared library와 관련된 스키마 객체인 library를 생성한다.

구문

<create library statement> ::=
      CREATE [ OR REPLACE ] LIBRARY <library name> 
      { IS | AS }
      '<file path name>';

사용 범위 및 접근 권한

<create library statement> 구문을 수행하려면 사용자가 다음 조건을 만족해야 한다.

구문 규칙 및 파라미터

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 구문을 사용하여 제거할 수 있다.

사용 예

gSQL>
CREATE LIBRARY lib1 AS 'add.so';
/

Library created.
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> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

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)의 관점으로 수행할지 명시한다.
<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이 가능하다.

사용 예

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> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

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이 가능하다.

생성된 package body는 아래의 구문으로 삭제할 수 있다.

사용 예

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> 구문을 수행하려면 사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

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)의 관점으로 수행할지 명시한다.
<invoker rights clause>을 생략하면 기본값은 AUTHID DEFINER이다.

procedure characteristics

<procedure characteristics>은 procedure의 특성을 명시한다.
동일한 특성에 대해서 중복은 허용하지 않는다.
자세한 설명은 Routine Characteristics를 참고한다.

routine body

설명

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 표준에서는 다음과 같은 절을 정의하지 않고 있다.

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> 구문을 수행하려면  사용자가 다음 조건들을 만족해야 한다.

구문 규칙 및 파라미터

OR REPLACE

기존에 동일한 trigger가 존재할 경우, 기존 trigger를 새로운 trigger로 대체한다.

<trigger name>

생성할 trigger의 이름으로서, 스키마 내에서 고유해야 한다.
schema_name.trigger_name과 같이 trigger가 속할 스키마를 정의할 수 있다.
schema_name을 생략할 경우, 구문을 수행하는 사용자의 기본 스키마 이름이 사용된다.
Trigger 이름의 길이는 128 바이트보다 작아야 한다.

<trigger action time>

Trigger가 수행되는 시점을 정의한다.

<trigger event>

Event table에서 발생한 DML에 따라 trigger 실행 여부를 결정한다.
하나 이상의 <trigger event>를 지정할 수 있다.
동일한 <trigger event>를 중복해서 지정할 수 없다.
<trigger event>의 종류는 다음과 같다.

<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, NEW transition table, OLD transition variable, NEW transition variable 이름은 중복해서 지정할 수 없다.
사용자가 선언한 transition table 또는 transition varible은 <triggered action> 내에서만 사용할 수 있다.

FOR EACH ROW/ FOR EACH STATEMENT

Trigger의 실행 단위를 지정한다.
별도로 지정하지 않으면, 기본적으로 FOR EACH STATEMENT로 동작한다.

<trigger enforcement>

Trigger를 활성화된 상태로 생성할지, 비활성화된 상태로 생성할지를 지정한다.
별도로 지정하지 않으면 trigger는 기본적으로 활성화된 상태로 생성된다.
ENABLE 과 ENFORCED 는 동일한 의미이다.
DISABLE 과 NOT ENFORCED 는 동일한 의미이다.

<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의 활성화 상태를 변경할 수 있다.

생성된 trigger는 DROP TRIGGER 구문을 사용하여 제거할 수 있다.
또한, event table 객체가 제거되면 해당 trigger도 함께 제거된다.

사용 예

-- 시스템 로그 테이블
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.
-- 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.
-- 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.
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.
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.
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.
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.
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.
-- 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.

호환성

SQL 표준 호환성

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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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 표준은 다음과 같은 절을 정의하지 않고 있다.

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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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 표준은 다음과 같은 절을 정의하지 않고 있다.

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> 구문을 수행하려면 사용자에게 다음 권한 중 하나가 있어야 한다.

구문 규칙 및 파라미터

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.

호환성

SQL 표준 호환성

Feature ID

설명

지원 여부

T200

Trigger DDL

O

참조

자세한 내용은 다음을 참조한다.