Postgres 프로시저내에서 테이블 인서트하기 0 8 834

by 김선우 [DB 기타] Postgres Insert SubQuery [2017.08.09 10:41:08]


Postgres에서 프로시저를 작성해서 인서트를 하고자 합니다.

 

create or replace function func1(pMonth varchar)

returns integer as $$

  DECLARE

     var_str varchar(100)

  BEGIN

      insert into

           t1

      select

          a.name

         ,a.id

         ,b.birthday

       from

           t2 a left join t3 b on a.id = b.id

       where

           a.month = pMonth ;

        raise info '%: insert success ', now();

        return 0;

  EXCEPTION WHEN OTHERS THEN

      select SQLSTATE || ':' || SQLERRM INTO var_str;

      raise info '%: error : %',now(),var_str;

  END;

$$ LANGUAGE 'plpgsql';

 

위에와 같이 코드를 작성하고 실행하고자하는데 실행이 않되네요.

에러도 안나오고 바로 return 0 문으로 가버립니다.

    

by jkson [2017.08.09 11:22:57]

Postgres는 잘모르지만.. COMMIT은 따로 로직이 있는 건가요?

그리고 insert 할 때 보면 컬럼 지정이 따로 없는데

해당 테이블에 컬럼이 늘어나거나 하면 오류 날 거 같은데요..


by 김선우 [2017.08.09 12:06:35]

jkson님 댓글 감사합니다.

commit과 insert 칼럼수의 문제는 별도의 문제 ^^;

 

 


by jkson [2017.08.09 12:18:53]

insert 문에서 오류가 안 나서 return 문까지 간 거니

실행은 되었는데 select 된 게 없다는 거네요.

left join 이니 데이터는 있었을테고..

그렇다면 a.month = pMonth 조건에서 전부 필터링 되는 게 아닐까용?

데이터형이 차이가 났다든지..


by 주킹 [2017.08.09 12:31:12]

1. insert 구문을 밖에서 했을 때 정상적인지...

2. naise info 했을때 now()값이 찍히는지.

3. return값이 필요한 것인지 (필요없다면 void값으로...)


by 김선우 [2017.08.09 14:10:38]

jkson님 주킹님 감사합니다.

 pMonth부분을 '201706'로 치환한 뒤에 sql의 insert부터 where부분까지를 스크립트로 실행하면 문제 없이 실행 됩니다.

고로 조건을 만족하는 데이타는 있는거구요. raise info 부분은 확인방법을 몰라서 못하고 있습니다.

debugger에서 실행하면 바로 return문으로 가버려서요.

 

 

 


by 주킹 [2017.08.09 15:10:51]

create or replace function func1(pMonth varchar)

returns varchar as $$

  DECLARE

     var_str varchar(100);

  BEGIN

      insert into

           t1

      select

          a.name

         ,a.id

         ,b.birthday

       from

           t2 a left join t3 b on a.id = b.id

       where

           a.month = pMonth ;

        raise info '%: insert success ', now();

        return 0;

  EXCEPTION WHEN OTHERS THEN

      select SQLSTATE || ':' || SQLERRM INTO var_str;

      raise info '%: error : %',now(),var_str;

  END;

$$ LANGUAGE 'plpgsql';

 

샘플로 수행해보면 데이터가 잘들어가는데여...

insert 되고 나서 return구문으로 가는 것은 정상입니다.


by jkson [2017.08.09 15:26:09]

저도 Postgre에서 비슷한 function 만들어봤는데

var_str varchar(100) 뒤에 ; 빠진 거 이외에 별다른 문제는 없었고 데이터 insert도 잘 되는 것 같아요.


by 김선우 [2017.08.10 13:16:41]

주킹님 jkson님 감사합니다.

제 불찰 입니다.

 

잘 되네요... ==;

 

감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입