2017-11-24 3 views
0

제한되어야하는 VARCHAR 인수와 함께 PL/pgSQL 함수를 작성하려고합니다.PL/pgSQL 함수 (VARCHAR를 매개 변수로 사용)

CREATE OR REPLACE FUNCTION do_nothin(v_value VARCHAR(5)) 
RETURNS TEXT AS 
$$ 
DECLARE 
BEGIN 
    RETURN v_value; 
END; 
$$ 
LANGUAGE plpgsql; 

이 작품은 내가 텍스트보다 더 큰 5이 함수를 호출 할 때, 그것은 않습니다 :

DO $$ 
DECLARE 
BEGIN 
    PERFORM do_nothin('123456'); 
END; 
$$ 

그것은 나를을 제공합니다 (5 개) 문자의 크기로 제한된 VARCHAR 매개 변수, 함수를 다음 고려 결과 '123456',하지만 왜? 이것은 나에게 오류를 줄 것이다?

내가 정의하는 경우이 같은 VARCHAR : 그것은 나에게 예상대로 오류 제공

DO $$ 
DECLARE 
    v_mytext VARCHAR(5); 
BEGIN 
    v_mytext := '123456'; 
END; 
$$ 

: 나는 함수에 대한 너무 큰 논쟁이있을 때 발생이 오류를 원하는

ERROR: value too long for type character varying(5) CONTEXT: PL/pgSQL  function inline_code_block line 5 at assignment SQL state: 22001 

을, 하지만 어떻게?

답변

1

PostgreSQL은 역사적인 이유로 인해 함수 인수 유형 (typmod)에서 크기 수정자를 무시합니다. 구현과 관련된 몇 가지 문제가 있습니다. 간단하고 좋은 솔루션은이 유형의 기능을 무시합니다. 예상되는 동작은 varchar에서는 간단하지만 숫자 유형에 대해 올바른 사용자 친화적 인 동작을 설계하는 것은 꽤 어려울 수 있습니다.

create or replace function fx(a varchar(10)) 
returns varchar as $$ begin return a; end $$ language plpgsql; 

postgres=# \sf fx 
CREATE OR REPLACE FUNCTION public.fx(a character varying) 
RETURNS character varying 
LANGUAGE plpgsql 
AS $function$ begin return a; end $function$ 

- typmod 값이 지속되지 않음을 알 수 있습니다. 그런 다음 효과가 없습니다. 당신이 정말로 몇 가지 한계가 필요한 경우

, 당신은 domain type를 사용한다 :

postgres=# create domain varchar_10 as varchar(10); 
CREATE DOMAIN 
postgres=# create or replace function fx2(a varchar_10) 
returns varchar as $$ begin return a; end $$ language plpgsql 
CREATE FUNCTION 
postgres=# select fx2('12345678901'); 
ERROR: value too long for type character varying(10) 

도메인은 모든 (typmods, 수표)와 지속 형 동의어입니다.