본문 바로가기

개발/Java

JAVA SQLWarning 을 이용한 postgresql function 의 raise notice 출력문구 조회방법

728x90
반응형

postgresql function 을 개발하고 실행하게 되면 function 내에서 raise 명령어를 이용하여 파라미터값 검증, 특정 데이터의 건수조회를 출력하게 될 것이다.

function 실행시 pglog 를 확인하는 방법이 있지만 터미널로 접속 후 일일히 로깅을 확인하여야 한다. (불편하다.;;;)

자바에서는 postgresql function 을 실행할때 SQLWarning(JDBC) 클래스를 사용하여 raise notice 의 문구를 가져올 수가 있다.

 

개발/실행환경

  • Postgresql 13.x / dbeaver
  • JDK 11 / Eclipse

 

1. 테스트용 function 개발

create or replace function public.fn_sqlwarning_test(p_count integer)
returns integer as
$$
declare
    v_type_cd varchar := 'ABC001';
BEGIN

    -- 파라미터 출력
    raise debug 'RAISE 1 - p_count : %', p_count;
    raise log 'RAISE 2 - p_count : %', p_count;
    raise info 'RAISE 3 - p_count : %', p_count;
    raise notice 'RAISE 4- p_count : %', p_count;
    raise warning 'RAISE 5- p_count : %', p_count;

    -- 변수출력
    raise notice 'v_typ_cd : %', v_type_cd;
    raise notice 'timestamp : %, version : %', current_timestamp, version();
	
    return p_count;

END;
$$
LANGUAGE plpgsql

public.fn_sqlwarning_test(<입력값>) - 입력값을 반환해 주는 function

 

2. function 실행

select public.fn_sqlwarning_test(1) as return_val;
select public.fn_sqlwarning_test(2) as return_val;

 

3. Postgresql Function 실행하는 JAVA 소스 개발 후 실행

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLWarning;

import org.postgresql.Driver;

/**
 * Postgresql Function 실행시 raise 실행문구 가져오기
 */
public class RaiseNoticeTest {

	public void execution() throws Exception{
		System.out.println(">>> Start >>>");
		
		Connection con = null; 
		PreparedStatement pre = null;
		ResultSet rs = null;
		
		try {
		    // Postgresql JDB Driver 정보 출력
		    System.out.println("Driver Version : " + Driver.getVersion());

		    Class.forName("org.postgresql.Driver");
		    String url = "jdbc:postgresql://192.168.2.165:5432/postgres";      
		    String user = "postgres";
		    String password = "<암호>";

		    String sql = "select public.fn_sqlwarning_test(?) as return_val";
		    
		    con = DriverManager.getConnection(url, user, password);
		    pre = con.prepareStatement(sql);
		    pre.setInt(1, 2021);
		    rs = pre.executeQuery();
		    
		    System.out.println("");
		    System.out.println("ResultSet");
		    
		    if(rs.next()) {
		    	System.out.println(rs.getInt(1));
		    }
		    
		    System.out.println("");
		    System.out.println("SQLWarning");
		    SQLWarning sqlWarning = pre.getWarnings();
		    
		    while(sqlWarning != null) {
		    	String sqlState = sqlWarning.getSQLState();
		    	String message = sqlWarning.getMessage();
		    	System.out.println("SQLState : " + sqlState + ", Message : " + message);
		    	
		    	sqlWarning = sqlWarning.getNextWarning();
		    }
		    
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			if(rs != null) rs.close();
			if(pre != null) pre.close();
			if(con != null) con.close();
			
			System.out.println("<<< End <<<");	
		}
	}

	public static void main(String[] args) throws Exception {
		RaiseNoticeTest raiseNoticeTest = new RaiseNoticeTest();
		raiseNoticeTest.execution();
	}

}

 

 

Postgresql Function 의 raise 문구 출력을 확인 할 수 있을 것이다.

raise debug, raise log 가 출력되지 않은 이유는 postgresql 의 로그 레벨 설정이 INFO 이상으로 설정되어 있기 때문이다.

 

raise 관련된 Postgresql 공식 사이트를 확인해보자.

www.postgresql.org/docs/13/plpgsql-errors-and-messages.html

 

42.9. Errors and Messages

42.9. Errors and Messages 42.9.1. Reporting Errors and Messages 42.9.2. Checking Assertions 42.9.1. Reporting Errors and Messages Use the RAISE statement to …

www.postgresql.org

 

728x90
반응형