오라클에서 자바 RANDOMUUID() 내장함수 쓰기

 

일단,

 

dba_registry 을 뒤져서 오라클에 JVM이 설치되어 있는지 확인한다.

 

select comp_name, version, status from dba_registry; 

 

comp_name컬럼에 JServer JAVA Virtual Machine 이놈이 있다면 가능

 

없으면 

 

sql> @$ORACLE_HOME/javavm/install/initjvm.sql;

실행하거나 

 

저 경로로 가서 해당 sql의 DDL을 직접 복붙해서 실행한다.

이건 안해봤음... 

 

(참조)

 

어쨌든 JVM이 설치되어 있다면, 다음과 같은 SQL명령어를 먼저 실행한다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

CREATE OR REPLACE AND COMPILE

 

java source named "RandomUUID"

 

as

 

public class RandomUUID {

 

public static String create() {

 

return java.util.UUID.randomUUID().toString();

 

}

 

};

 

정상적으로 실행이 완료되었다면,

 

이제 FUNCTION을 만들자.

 

1

2

3

4

5

6

7

CREATE OR REPLACE FUNCTION O_ONEMES.RandomUUID

 

RETURN VARCHAR2

 

AS LANGUAGE JAVA

 

NAME 'RandomUUID.create() return java.lang.String' ;

 

 

 

이 함수를 만들었다면,

 

실행해보자

SELECT RANDOMUUID() FROM DUAL;

 

이런식의 결과값이 나올것이다.

ex) 8b636560-99dc-4c75-976b-56350f4f40ca

 

 

추가: 내장객체 쓰지 않고 랜덤 채번 함수 만들기

https://mo-world.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%EB%9E%9C%EB%8D%A4-%ED%82%A4%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95-2%EA%B0%80%EC%A7%80-FUNCTION%ED%95%A8%EC%88%98

 

프로시저 생성 [형식]

*생성 또는 대체해라(있으면 REPLACE) 프로시저를
CREATE [OR REPLACE] PROCEDURE [*프로시저 이름넣는 곳]
    (

     argument1 [mode] data_type,
     argument2 [mode] data_type....   

    )

 

예)

    (

      (매개변수): 프로그램과 값을 주고받는 역할, 

      프로시저로 값을 전달하는 IN

      , 프로시저에서 실행환경으로 값을 전달하는 OUT

      ,  양쪽으로 전달하는 INOUT 3가지 종류

     

      *매개변수가 없으면 이렇게 선언

      v_test VARCHAR2(10);

      v_test DATE; 

 

      *매개변수를 써야하면 이렇게 선언

      v_test IN VARCHAR

      p_test OUT VARCHAR2 

      

      *여기서 데이터 타입을 특정 테이블의 컬럼 데이터로 줄수 있다.

      v_name IN testTable.user_name%TYPE

    )


IS [OR AS
    local_variable declaration

   

    *지역변수 선언
     v_username varchar2(50);
     v_cnt product.qty%type;

 


BEGIN


    statement1;
    statement2;
    ..

     *본문구성 (작성중)....

       업데이트 할게요 
END;
/

 

 

 

 

 

프로시저, 함수, 트리거, 커서 간단개념은 아래링크에서....

 

https://mo-world.tistory.com/entry/%EB%88%88%EC%97%90%ED%99%95-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-%ED%95%A8%EC%88%98-%ED%8A%B8%EB%A6%AC%EA%B1%B0-%EC%BB%A4%EC%84%9C-%EA%B0%9C%EB%85%90

프로시저

*리턴 값이 필요없고, 각각의 절차적 쿼리를 순차적으로 일괄 진행하기 위해 사용하지만

 리턴하고 싶다면 리턴 할수는 있음

 

함수

*내장함수가 제공하지 않은 사용자가 원하는 함수를 만들어 쓸 수 있으며, 주로 함수의 결과

 리턴 값을 받아쓰기 위해 사용한다. 

 

트리거

*테이블의 특정 동작이 일어나면 자동실행(테이블의 DML문이 작동되면 자동으로 실행)

 

커서

*결과의 로우수는 하나 이상인데, 개별로우에 순차적으로 접근하여 가공하거나 저장해서

 쓰려고 할 때 사용 

 

쉽게 생각해서

 

팀별로 쌓이는 돈을 저장하는 테이블로 가정하였을 때, 팀별 머니 총계는?

예를 들면 이런 테이블이라고 가정하면.......

TEMA_ID   MONEY

TEAM1      100

TEAM1      200

TEAM2      700

TEAM3      150

.

.

SELECT TEAM_ID, SUM( MONEY ) OVER (PARTITION BY TEAM_ID) AS 수익

FROM TEAM_TABLE

 

이경우 머니는 SUM되면서 TEAM_ID 별로 GROUP BY 된다. 즉,  PARTITION BY 를 GROUP BY처럼 쓴것

TEAM1      300

TEAM1      300

TEAM2      700

TEAM3      150

 

DISTINCT 를 이용해서 중복제거만 해주면 원하는 데이터가 나온다.

SELECT DISTINCT TEAM_ID, SUM( MONEY ) OVER (PARTITION BY TEAM_ID) AS 수익

FROM TEAM_TABLE

 

TEAM1      300

TEAM2      700

TEAM3      150

 

+ Recent posts