본문 바로가기

Note

[개발] 오라클 정규식 함수의 이관

프로젝트 지원 업무가 있어 ORACLE의 프로시저를 변환 작업 중 정규식 함수로 프로시저 컴파일이 되지 않는 문제가 발생을 했었다.

DB2에서 제공되는 정규식 함수를 찾아 보니 9개 정도가 된다.

- REGR_AVGX, REGR_AVGY, REGR_COUNT, REGR_INTRCEPT, REGR_R2, REGR_SLOPE, REGR_SXX, REGR_SXY, REGR_SYY

통계와 관련된 어려운 함수들만 제공되는 것 같다.

개발자가 문의한 함수는 REGEXP_SUBSTR() 인데 위에 언급했다시피 존재하지 않는다. 웹에서 검색을 해 보니, (V8, V9.1 버전 시절의 오라클 함수 포팅 방법인) java 함수로 해당 함수를 포팅할 수 있도록 IBM Developerworks 기술 문서에 기술되어 있었다.

제공되는 함수는 4가지 (REGEXP_LIKE, REGEXT_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR)…

잘 사용되는 대부분의 오라클 함수는 지원될 것이라 생각했는데, 이렇게 피해가는 함수들이 존재를 한다.

해당 자바 함수를 DB에 생성하기 위해서는 db2_regex.jar 파일이 필요하다. (블로그에 파일이 첨부되지 않으므로, jar 파일은 글 아래의 URL 주소를 통하여 다운로드 받도록 한다.)

해당 JAR 파일은 SQLJ.INSTALL_JAR 프로시저를 이용하여 설치한다.

구문
call sqlj.install_jar(‘file:JAR_파일경로_파일명’, JAR_ID)

실행 예
CALL SQLJ.INSTALL_JAR('file:/tmp/avalanche/db2_regex/lib/db2_regex.jar', db2_regex)

 

생성해야 되는 정규식 함수 script는 다음과 같다.

CREATE OR REPLACE FUNCTION REGEXP_LIKE(SOURCE VARCHAR(3000), REGEX VARCHAR(512), MODE VARCHAR(3))

RETURNS INTEGER
FENCED
NOT DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'db2_regex:com.ibm.avalanche.udf.regex.Regexp.regexpLike'
NO EXTERNAL ACTION
@
 

CREATE OR REPLACE FUNCTION REGEXP_REPLACE(SOURCE VARCHAR(3000), REGEX VARCHAR(512), REPLACEMENT VARCHAR(3000), POSITION INTEGER, OCCURRENCE INTEGER, MODES VARCHAR(3))

RETURNS VARCHAR(3000)
FENCED
NOT DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'db2_regex:com.ibm.avalanche.udf.regex.Regexp!regexpReplace'
NO EXTERNAL ACTION
@
 

CREATE OR REPLACE FUNCTION REGEXP_SUBSTR(SOURCE VARCHAR(3000), REGEX VARCHAR(512), POSITION INTEGER, OCCURRENCE INTEGER, MODES VARCHAR(3))

RETURNS VARCHAR(3000)
FENCED
NOT DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'db2_regex:com.ibm.avalanche.udf.regex.Regexp!regexpSubstr'
NO EXTERNAL ACTION
@
 
CREATE OR REPLACE FUNCTION REGEXP_INSTR(SOURCE VARCHAR(3000), REGEX VARCHAR(512), POSITION INTEGER, OCCURRENCE INTEGER, ROPT INTEGER, MODES VARCHAR(3))

RETURNS INTEGER
FENCED
NOT DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'db2_regex:com.ibm.avalanche.udf.regex.Regexp!regexpInstr'
NO EXTERNAL ACTION
@

jar 설치부터 자바 함수 생성은 하나의 script로 작성하여 생성 작업을 완료할 수 있다.

스크립트 파일 예

vi /work/reg.db2
CALL SQLJ.INSTALL_JAR('file:/work/db2_regex.jar', db2_regex) @

CREATE OR REPLACE FUNCTION REGEXP_LIKE(SOURCE VARCHAR(3000), REGEX VARCHAR(512), MODE VARCHAR(3))

RETURNS INTEGER
FENCED
NOT DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'db2_regex:com.ibm.avalanche.udf.regex.Regexp.regexpLike'
NO EXTERNAL ACTION
@



생성 예

db2 connect to 디비명 user 사용자ID using 사용자비밀번호
db2 –td@ –v –f /work/reg.db2
db2 terminate

 

참고 문서

1. DB2에서 제공하는 정규식 함수

http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0002321.html

2. 자바 정규식 함수 생성 및 실행

http://www.ibm.com/developerworks/kr/data/library/techarticle/dm-1011db2luwpatternmatch/