database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 10066 게시물 읽기
No. 10066
함수에서 파라미터 관련
작성자
지현명(gwise)
작성일
2019-04-23 17:36ⓒ
2019-04-23 17:38ⓜ
조회수
3,344

안녕하세요..

함수를 개발할 때 파마리터를 아래와 같이 생성하고 생성된 걸 다시 보면 아래와 같이 변경됩니다. 

ufn_get_lobsm040(p_compky varchar(10)) ->  ufn_get_lobsm040(p_compky character varying)  

 사용자가 지정한 것처럼 varchar(10)  이걸 고정되게 할 수는 없나요?

 

p.s

프로시저는 결국 몇개 안쓰고 전부 함수로 개발중입니다.  에러날때  EXCEPTION쪽으로 진입이 안되네요..

거기서 rollback하려고 했는데..

이 글에 대한 댓글이 총 2건 있습니다.

1.

프로시져나, 함수의 입출력 매개변수의 자료형 표현은 pg 내부에서 쓰는 기본 자료형으로 보여집니다. varchar(10) 해도 이 (10)을 의미하는 길이 제한은 반영되지 않고 자료형만 반영됩니다. 그 varchar 가 pg에서는 character varying 임으로 그렇게 됩니다.  (10)의 의미는 사라져버립니다. 

 

create function testfunc (a varchar(10)) returns varchar(10) language plpgsql as 'begin return a; end;'

이렇게 만들었다고 해도, 
 
select testfunc('01234567890123456789');
 
이렇게 호출해서 사용했을 때 오류로 처리하지 않습니다.  즉, (10)의 의미가 없는게죠.
 
 
2.
프로시져에서 exception 에서 rollback은 그냥 건너뛰면 됩니다. 
(11) postgres@postgres=# \d t
                "public.t" 테이블
 필드명 |  종류   | Collation | NULL허용 | 초기값 
--------+---------+-----------+----------+--------
 a      | integer |           |          | 
 b      | integer |           |          | 

(11) postgres@postgres=# select * from t;
   a   |   b   
-------+-------
 10000 | 1000
(1개 행)

(11) postgres@postgres=# \ef testfunc
CREATE PROCEDURE
(11) postgres@postgres=# CREATE OR REPLACE PROCEDURE public.testfunc(p_a integer)
 LANGUAGE plpgsql
AS $procedure$
declare
  i int;
begin
for i in reverse 10..-10 loop
  raise notice '%', i;
  begin
    update t set b = a / i where a = p_a;
    exception when others then raise notice 'error';
    commit;
  end;
end loop;
end;
(11) postgres@postgres=# call testfunc(10000);
알림:  10
알림:  9
알림:  8
알림:  7
알림:  6
알림:  5
알림:  4
알림:  3
알림:  2
알림:  1
알림:  0
알림:  error
알림:  -1
알림:  -2
알림:  -3
알림:  -4
알림:  -5
알림:  -6
알림:  -7
알림:  -8
알림:  -9
알림:  -10
CALL
(11) postgres@postgres=# select * from t;
   a   |   b   
-------+-------
 10000 | -1000
(1개 행)
 
김상기(ioseph)님이 2019-04-24 11:37에 작성한 댓글입니다.

CREATE OR REPLACE PROCEDURE public.usp_set_lobsm020(p_barcode_json json, p_userid character varying)

LANGUAGE plpgsql

AS $procedure$

DECLARE

_sqlstate TEXT;

_message TEXT;

_context TEXT;

BEGIN

 

WITH cte AS (SELECT A.slipno, A.lbbrcd, A.status FROM json_to_recordset(p_barcode_json) AS A(slipno varchar, lbbrcd varchar, status varchar))

INSERT INTO public.lobsli1 (slipno, lbbrcd, inspty, userid, status, wrktim, cretim, creusr, lmotim, lmousr)

SELECT A.slipno, A.lbbrcd, 'PI', p_userid, A.status, clock_timestamp(), clock_timestamp(), p_userid, clock_timestamp(), p_userid FROM cte A

ON CONFLICT (slipno, lbbrcd, inspty)

DO UPDATE SET

status = excluded.status,

lmotim = clock_timestamp(),

lmousr = p_userid

WHERE public.lobsli1.status <> excluded.status

;

 

commit;

 

EXCEPTION

WHEN OTHERS THEN

rollback;

GET STACKED DIAGNOSTICS

_sqlstate = RETURNED_SQLSTATE, _message = MESSAGE_TEXT, _context = PG_EXCEPTION_CONTEXT;

RAISE EXCEPTION 'sqlstate: %, message: %, context: [%]',_sqlstate, _message, replace(_context, E'n', ' <- ');

END;

$procedure$

;

 

 

이렇게 프로시저를 개발해서 ms-sql이나 오라클 처럼 에러 발생하면 맨 아래 EXCEPTION 이후 블록으로 진입하는줄

알았는데 바로 튕겨 버립니다.

 

답변 주신 내용을 보면 맨 마지막이 아니라 중간중간에 exception when 블럭을 만들면 되는거 같은데

테스트 해보겠습니다. 감사합니다.

지현명(gwise)님이 2019-04-24 15:21에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10069postgres 관련 오프라인 강좌 추천 부탁드립니다. [1]
지오니
2019-05-02
3809
10068DB 해킹당했습니다. [1]
맨붕
2019-04-30
3484
10067postgresql 외부 라이브러리 사용 방법 [6]
cu
2019-04-29
3470
10066함수에서 파라미터 관련 [2]
지현명
2019-04-23
3344
10065특정유저에 function execute 권한 부여 후 조회할 수 있는 방법이 있나요? [1]
전석
2019-04-12
3368
10064psql시, FATAL: the database system is in recovery mode 문제 [2]
카비
2019-04-12
5470
10063postgresql-11.2 사용시 jdbc 드라이버는 뭘 사용해야하나요.. [1]
권기혁
2019-04-11
3134
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다