저장 함수/프로시저 정의문¶
CREATE PROCEDURE¶
CREATE PROCEDURE 문을 사용하여 저장 프로시저를 등록한다. CUBRID는 Java를 제외한 다른 언어에서는 저장 프로시저를 지원하지 않는다. CUBRID에서 저장 프로시저는 오직 Java로만 구현 가능하다. 등록한 저장 프로시저의 사용 방법은 Java 저장 함수/프로시저를 참고한다.
CREATE [OR REPLACE] PROCEDURE procedure_name [(<parameter_definition> [, <parameter_definition>] ...)]
{IS | AS} LANGUAGE JAVA <java_call_specification>
COMMENT 'sp_comment_string';
<parameter_definition> ::= parameter_name [IN|OUT|IN OUT|INOUT] sql_type [COMMENT 'param_comment_string']
<java_call_specification> ::= NAME 'java_method_name (java_type [,java_type]...) [return java_type]'
procedure_name: 생성할 저장 프로시저의 이름을 지정한다(최대 254바이트).
parameter_name: 인자의 이름을 지정한다(최대 254바이트).
sql_type: 인자의 데이터 타입을 지정한다. 지정할 수 있는 데이터 타입은 데이터 타입 매핑을 참고한다.
param_comment_string: 인자 커멘트 문자열을 지정한다.
sp_comment_string: 저장 프로시저의 커멘트 문자열을 지정한다.
java_method_name: 자바의 클래스 이름을 포함하여 자바의 메소드 이름을 지정한다.
java_type: 자바의 데이터 타입을 지정한다. 지정할 수 있는 데이터 타입은 데이터 타입 매핑을 참고한다.
로드한 자바 클래스에 대해 SQL 문이나 Java 응용 프로그램에서 클래스 내의 함수를 어떻게 호출할지 모르기 때문에 Java Call Specification (<java_call_specification>)를 사용하여 등록해야 한다. Java Call Specification 작성 방법에 대해서는 Java Call Specification을 참조한다.
저장 프로시저의 커멘트¶
저장 프로시저의 커멘트를 다음과 같이 제일 뒤에 지정할 수 있다.
CREATE FUNCTION Hello() RETURN VARCHAR
AS LANGUAGE JAVA
NAME 'SpCubrid.HelloCubrid() return java.lang.String'
COMMENT 'function comment';
저장 프로시저의 인자 뒤에는 다음과 같이 지정할 수 있다.
CREATE OR REPLACE FUNCTION test(i in number COMMENT 'arg i')
RETURN NUMBER AS LANGUAGE JAVA NAME 'SpTest.testInt(int) return int' COMMENT 'function test';
저장 프로시저의 커멘트는 다음 구문을 실행하여 확인할 수 있다.
SELECT sp_name, comment FROM db_stored_procedure;
저장 프로시저 인자의 커멘트는 다음 구문을 실행하여 확인할 수 있다.
SELECT sp_name, arg_name, comment FROM db_stored_procedure_args;
등록된 저장 프로시저의 정보 확인¶
등록된 저장 프로시저의 정보는 db_stored_procedure 시스템 가상 클래스와 db_stored_procedure_args 시스템 가상 클래스에서 확인할 수 있다. db_stored_procedure 시스템 가상 클래스에서는 저장 프로시저의 이름과 타입, 인자의 수, Java 클래스에 대한 명세, 저장 프로시저의 소유자에 대한 정보를 확인할 수 있다. db_stored_procedure_args 시스템 가상 클래스에서는 저장 프로시저에서 사용하는 인자에 대한 정보를 확인할 수 있다.
SELECT * FROM db_stored_procedure WHERE sp_type = 'PROCEDURE';
sp_name sp_type return_type arg_count lang target owner
================================================================================
'athlete_add' 'PROCEDURE' 'void' 4 'JAVA''Athlete.Athlete(java.lang.String, java.lang.String, java.lang.String, java.lang.String)' 'DBA'
SELECT * FROM db_stored_procedure_args WHERE sp_name = 'athlete_add';
sp_name index_of arg_name data_type mode
=================================================
'athlete_add' 0 'name' 'STRING' 'IN'
'athlete_add' 1 'gender' 'STRING' 'IN'
'athlete_add' 2 'nation_code' 'STRING' 'IN'
'athlete_add' 3 'event' 'STRING' 'IN'
DROP PROCEDURE¶
CUBRID에서는 등록한 저장 프로시저를 DROP PROCEDURE 구문을 사용하여 삭제할 수 있다. 이 때, 여러 개의 procedure_name 을 콤마(,)로 구분하여 한꺼번에 여러 개의 저장 프로시저를 삭제할 수 있다.
DROP PROCEDURE procedure_name [{ , procedure_name , ... }]
procedure_name: 제거할 프로시저의 이름을 지정한다.
DROP PROCEDURE hello, sp_int;
저장 프로시저의 삭제는 프로시저를 등록한 사용자와 DBA의 구성원만 삭제할 수 있다. 예를 들어 ‘sp_int’ 저장 프로시저를 PUBLIC 이 등록했다면, PUBLIC 또는 DBA 의 구성원만이 ‘sp_int’ 저장 프로시저를 삭제할 수 있다.
CREATE FUNCTION¶
CREATE FUNCTION 문을 사용하여 저장 함수를 등록한다. CUBRID는 Java를 제외한 다른 언어에서는 저장 함수를 지원하지 않는다. CUBRID에서 저장 함수는 오직 Java로만 구현 가능하다. 등록한 저장 함수의 사용 방법은 Java 저장 함수/프로시저를 참고한다.
CREATE [OR REPLACE] FUNCTION function_name [(<parameter_definition> [, <parameter_definition>] ...)] RETURN sql_type
{IS | AS} LANGUAGE JAVA <java_call_specification>
COMMENT 'sp_comment_string';
<parameter_definition> ::= parameter_name [IN|OUT|IN OUT|INOUT] sql_type [COMMENT 'param_comment_string']
<java_call_specification> ::= NAME 'java_method_name (java_type [,java_type]...) [return java_type]'
function_name: 생성할 저장 함수의 이름을 지정한다(최대 254바이트).
parameter_name: 인자의 이름을 지정한다(최대 254바이트).
sql_type: 인자 또는 리턴 값의 데이터 타입을 지정한다. 지정할 수 있는 데이터 타입은 데이터 타입 매핑을 참고한다.
param_comment_string: 인자 커멘트 문자열을 지정한다.
sp_comment_string: 저장 프로시저의 커멘트 문자열을 지정한다.
java_method_name: 자바의 클래스 이름을 포함하여 자바의 메소드 이름을 지정한다.
java_type: 자바의 데이터 타입을 지정한다. 지정할 수 있는 데이터 타입은 데이터 타입 매핑을 참고한다.
로드한 자바 클래스에 대해 SQL 문이나 Java 응용 프로그램에서 클래스 내의 함수를 어떻게 호출할지 모르기 때문에 Java Call Specification (<java_call_specification>)를 사용하여 등록해야 한다. Java Call Specification 작성 방법에 대해서는 Java Call Specification을 참조한다.
저장 함수의 커멘트¶
저장 함수의 커멘트를 다음과 같이 제일 뒤에 지정할 수 있다.
CREATE FUNCTION Hello() RETURN VARCHAR
AS LANGUAGE JAVA
NAME 'SpCubrid.HelloCubrid() return java.lang.String'
COMMENT 'function comment';
저장 함수의 인자 뒤에는 다음과 같이 지정할 수 있다.
CREATE OR REPLACE FUNCTION test(i in number COMMENT 'arg i')
RETURN NUMBER AS LANGUAGE JAVA NAME 'SpTest.testInt(int) return int' COMMENT 'function test';
저장 함수의 커멘트는 다음 구문을 실행하여 확인할 수 있다.
SELECT sp_name, comment FROM db_stored_procedure;
함수 인자의 커멘트는 다음 구문을 실행하여 확인할 수 있다.
SELECT sp_name, arg_name, comment FROM db_stored_procedure_args;
등록된 저장 함수의 정보 확인¶
등록된 저장 함수의 정보는 db_stored_procedure 시스템 가상 클래스와 db_stored_procedure_args 시스템 가상 클래스에서 확인할 수 있다. db_stored_procedure 시스템 가상 클래스에서는 저장 함수의 이름과 타입, 반환 타입, 인자의 수, Java 클래스에 대한 명세, 저장 함수의 소유자에 대한 정보를 확인할 수 있다. db_stored_procedure_args 시스템 가상 클래스에서는 저장 함수에서 사용하는 인자에 대한 정보를 확인할 수 있다.
SELECT * FROM db_stored_procedure WHERE sp_type = 'FUNCTION';
sp_name sp_type return_type arg_count lang target owner
================================================================================
'hello' 'FUNCTION' 'STRING' 0 'JAVA''SpCubrid.HelloCubrid() return java.lang.String' 'DBA'
'sp_int' 'FUNCTION' 'INTEGER' 1 'JAVA''SpCubrid.SpInt(int) return int' 'DBA'
SELECT * FROM db_stored_procedure_args WHERE sp_name = 'sp_int';
sp_name index_of arg_name data_type mode
=================================================
'sp_int' 0 'i' 'INTEGER' 'IN'
DROP FUNCTION¶
CUBRID에서는 등록한 저장 함수를 DROP FUNCTION 구문을 사용하여 삭제할 수 있다. 이 때, 여러 개의 function_name 을 콤마(,)로 구분하여 한꺼번에 여러 개의 저장 함수를 삭제할 수 있다.
DROP FUNCTION function_name [{ , function_name , ... }];
function_name: 제거할 함수의 이름을 지정한다.
DROP FUNCTION hello, sp_int;
저장 함수의 삭제는 함수를 등록한 사용자와 DBA의 구성원만 삭제할 수 있다. 예를 들어 ‘sp_int’ 저장 함수를 PUBLIC 이 등록했다면, PUBLIC 또는 DBA 의 구성원만이 ‘sp_int’ 저장 함수를 삭제할 수 있다.
Java Call Specification¶
Java 클래스를 로딩했을 때 SQL 문이나 Java 응용 프로그램에서 클래스 내의 함수를 어떻게 호출할지 모르기 때문에 Java 저장 함수/프로시저를 사용하기 위해서는 Call Specification를 사용하여 등록해야 한다.
Call Specification는 Java 함수 이름과 인자 타입 그리고 리턴 값과 리턴 값의 타입을 SQL 문이나 Java 응용프로그램에서 접근할 수 있도록 해주는 역할을 한다. Call Specification를 작성하는 구문은 CREATE PROCEDURE 또는 CREATE FUNCTION 구문을 사용하여 작성한다.
Java 저장 함수/프로시저의 이름은 대소문자를 구별하지 않는다.
Java 저장 함수/프로시저 이름의 최대 길이는 254바이트이다.
하나의 Java 저장 함수/프로시저가 가질 수 있는 인자의 최대 개수는 64개이다.
Java 저장 함수/프로시저의 인자를 OUT 으로 설정한 경우 길이가 1인 1차원 배열로 전달된다. 그러므로 Java 메서드는 배열의 첫번째 공간에 전달할 값을 저장해야 한다.
CREATE PROCEDURE test_out(x OUT STRING)
AS LANGUAGE JAVA
NAME 'SpCubrid.outTest(java.lang.String[] o)';
데이터 타입 매핑¶
Java 저장 함수/프로시저를 등록할 때, Java 저장 함수/프로시저의 반환 정의와 Java 파일의 선언부의 반환 정의가 일치하는지에 대해서는 검사하지 않는다. 따라서, Java 저장 함수/프로시저의 경우 등록할 때의 반환 정의를 따르고, Java 파일 선언부의 반환 정의는 사용자 정의 정보로서만 의미를 가지게 된다.
Call Specification에서는 SQL의 데이터 타입과 Java의 매개변수, 리턴 값의 데이터 타입이 맞게 대응되어야 한다. 또한 Java 저장함수/프로시저 구현 시, 질의 결과 (ResultSet)의 데이터 타입과 Java의 데이터 타입이 맞게 대응되어야 한다. CUBRID에서 허용되는 SQL과 Java의 데이터 타입의 관계는 다음의 표와 같다.
데이터 타입 매핑
Category
SQL Type
Java Type
Numeric Types
SHORT, SMALLINT
short, java.lang.Short
INT, INTEGER
int, java.lang.Integer
BIGINT
long, java.lang.Long
NUMERIC, DECIMAL
java.math.BigDecimal
FLOAT, REAL
float, java.lang.Float
DOUBLE, DOUBLE PRECISION
double, java.lang.Double
Date/Time Types
DATE
java.sql.Date
TIME
java.sql.Time
TIMESTAMP
java.sql.Timestamp
DATETIME
java.sql.Timestamp
TIMESTAMPLTZ
X (not supported)
TIMESTAMPTZ
X (not supported)
DATETIMELTZ
X (not supported)
DATETIMETZ
X (not supported)
Bit String Types
BIT
X (not supported)
VARBIT
X (not supported)
Character String Types
CHAR
java.lang.String
VARCHAR
java.lang.String
Enum Type
ENUM
X (not supported)
LOB Types
CLOB, BLOB
X (not supported)
Collection Types
SET, MULTISET, SEQUENCE
java.lang.Object[], java primitive type array, java wrapper class array
Special Types
JSON
X (not supported)
OBJECT, OID
cubrid.sql.CUBRIDOID <interface>
CURSOR
java.sql.ResultSet <interface>
묵시적 데이터 타입 변환
위의 표와 같이 SQL의 데이터 타입과 Java의 데이터 타입이 일치하지 않는 경우, CUBRID는 다음 표에 따라 묵시적으로 데이터 타입 변환을 시도한다. 묵시적 데이터 변환으로 인해 데이터가 손실될 수 있음을 주의해야한다.
SQL Data Types
Java Data Types
byte, java.lang.Byte
short, java.lang.Short
int, java.lang.Integer
long, java.lang.Long
float, java.lang.Float
double, java.lang.Double
java.math.BigDecimal
java.lang.String
java.sql.Time
java.sql.Timestamp
SHORT, SMALLINT
O
O
O
O
O
O
O
O
X
X
INT, INTEGER
O
O
O
O
O
O
O
O
X
X
BIGINT
O
O
O
O
O
O
O
O
X
X
NUMERIC, DECIMAL
O
O
O
O
O
O
O
O
X
X
FLOAT, REAL
O
O
O
O
O
O
O
O
X
X
DOUBLE DOUBLE PRECISION
O
O
O
O
O
O
O
O
X
X
DATE
X
X
X
X
X
X
X
O
O
O
TIME
TIMESTAMP
DATETIME
CHAR
O
O
O
O
O
O
O
O
O
O
VARCHAR
SET
X
X
X
X
X
X
X
X
X
X
MULTISET
SEQUENCE
X: 묵시적 변환을 허용하지 않음
O: 묵시적 변환 발생