greenplum数据库函数怎么加异常

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

greenplum数据库写了个自定义函数 请问我该如果把异常加入里面?

CREATE OR REPLACE FUNCTION S_FUNC_IDNUM(IN_IDNUM VARCHAR(18),IN_fifteenflag varchar(1))
    RETURNS varchar(18)
    LANGUAGE plpgsql
    VOLATILE
AS $$
    
------------------------------------------------------------------------
-- 参数:IN_IDNUM(输入18位身份证号码) INfifteenflag(输入Y或N)
-- 功能:输入18位身份证号码,1位Y或别的单个字符,进行验证,如果验证失败则返回N
-- 例如:S_FUNC_IDNUM('412832197901086418','Y')
------------------------------------------------------------------------
DECLARE
--定义中间参量
sqlcode INTEGER default 0;
i18 varchar(1) default '';--
n int default 0;--
l int default 0;

v_return varchar(18) default 'N';--
v_idnum varchar(18) default null;
v_i  varchar(1) default 'Y';


BEGIN
    v_idnum:=rtrim(IN_IDNUM);
 
    --算法
    l:=length(IN_IDNUM);--
    if (IN_fifteenflag is null or IN_fifteenflag ='') then 
         v_i := 'Y';
    else
           v_i := IN_fifteenflag;
    end if ;
  
    if l=18 then
        --验证前17位是否全部为数字
        if ltrim(rtrim(translate(SUBSTRING(IN_IDNUM,1,17),'0123456789',''))) <> '' then
            return 'N';--
        end if;--
        --验证年份格式
        if SUBSTRING(IN_IDNUM,7,4) NOT BETWEEN '1001' AND '9999' then
           return 'N';--
        end if;--
        --验证月份格式 
        if(SUBSTRING(IN_IDNUM,11,2) NOT BETWEEN '01' AND '12') then
           return 'N';--
        end if;--
        --验证日期格式
        if cast(SUBSTRING(IN_IDNUM,13,2) as integer) not BETWEEN 1 
            AND date_part('day',(substr(IN_IDNUM,7,4)||'-'||substr(IN_IDNUM,11,2)||'-'||'01') :: date +interval '1 mon' + interval '-1 day')
        then
          return 'N';--
        end if;
        --验证省份代码是否正确
        if(position('.'||left(IN_IDNUM,2)||'.' in '.11.12.13.14.15.21.22.23.31.32.33.34.35.36.37.41.42.43.44.45.46.50.51.52.53.54.61.62.63.64.65.71.81.82.91.')=0) then
        return 'N';--
        end if;--
    
        --验证校验位是否正确
        n:=cast(substr(IN_IDNUM,1,1) as integer)*7+cast(substr(IN_IDNUM,2,1)as integer)*9+cast(substr(IN_IDNUM,3,1)as integer)*10+cast(substr(IN_IDNUM,4,1) as integer)*5+cast(substr(IN_IDNUM,5,1)as integer)*8+ cast(substr(IN_IDNUM,6,1)as integer)*4;--
        n:=n+cast(substr(IN_IDNUM,7,1)as integer)*2+cast(substr(IN_IDNUM,8,1)as integer)*1+cast(substr(IN_IDNUM,9,1)as integer)*6+cast(substr(IN_IDNUM,10,1)as integer)*3+cast(substr(IN_IDNUM,11,1)as integer)*7+ cast(substr(IN_IDNUM,12,1)as integer)*9+cast(substr(IN_IDNUM,13,1)as integer)*10+cast(substr(IN_IDNUM,14,1)as integer)*5;--
        n:=n+cast(substr(IN_IDNUM,15,1)as integer)*8+cast(substr(IN_IDNUM,16,1)as integer)*4+cast(substr(IN_IDNUM,17,1)as integer)*2;--
        n:=mod(n,11);--
        if n=0      then  i18:='1';--
        elseif n=1 then  i18:='0';--
        elseif n=2 then  i18:='X';--
        elseif n=3 then  i18:='9';--
        elseif n=4 then  i18:='8';--
        elseif n=5 then  i18:='7';--
        elseif n=6 then  i18:='6';--
        elseif n=7 then  i18:='5';--
        elseif n=8 then  i18:='4';--
        elseif n=9 then  i18:='3';--
        elseif n=10 then i18:='2';--
        end if;--

       if i18 = upper(substr(IN_IDNUM,18,1)) then 
          v_return := v_idnum;
       else --
           v_return := 'N';
       end if;
elseif l=15 then
                --验证前15位是否为数字
             if ltrim(rtrim(translate(SUBSTRING(IN_IDNUM,1,15),'0123456789',''))) <> '' then
                return 'N';--
            end if;--

            --验证月份格式 
            if(SUBSTRING(IN_IDNUM,9,2) NOT BETWEEN '01' AND '12') then
               return 'N';--
            end if;--
            --验证日期格式
            if cast(SUBSTRING(IN_IDNUM,11,2) as integer) not BETWEEN 1 
               AND date_part('day',(substr(IN_IDNUM,7,4)||'-'||substr(IN_IDNUM,11,2)||'-'||'01') :: date +interval '1 mon' + interval '-1 day')
            then
                  return 'N';--
            end if;--
            --验证省份代码是否正确
            if(position('.'||left(IN_IDNUM,2)||'.' in '.11.12.13.14.15.21.22.23.31.32.33.34.35.36.37.41.42.43.44.45.46.50.51.52.53.54.61.62.63.64.65.71.81.82.91.')=0) then
                return 'N';--
            end if;--  
            
             --获取验证码
             n:=cast(substr(IN_IDNUM,1,1) as integer)*7+cast(substr(IN_IDNUM,2,1)as integer)*9+cast(substr(IN_IDNUM,3,1)as integer)*10+cast(substr(IN_IDNUM,4,1)as integer)*5+cast(substr(IN_IDNUM,5,1)as integer)*8+cast(substr(IN_IDNUM,6,1)as integer)*4;--
             n:=n+1*2+9*1+cast(substr(IN_IDNUM,7,1)as integer)*6+cast(substr(IN_IDNUM,8,1)as integer)*3+cast(substr(IN_IDNUM,9,1)as integer)*7+cast(substr(IN_IDNUM,10,1)as integer)*9+cast(substr(IN_IDNUM,11,1)as integer)*10+cast(substr(IN_IDNUM,12,1)as integer)*5;--
             n:=n+cast(substr(IN_IDNUM,13,1)as integer)*8+cast(substr(IN_IDNUM,14,1)as integer)*4+cast(substr(IN_IDNUM,15,1)as integer)*2;--
             n:=mod(n,11);--
            --生成18位证件号码
            if n=0 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'1';--
            elseif n=1 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'0';--
            elseif n=2 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'X';--
            elseif n=3 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'9';--
            elseif n=4 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'8';--
            elseif n=5 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'7';--
            elseif n=6 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'6';--
            elseif n=7 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'5';--
            elseif n=8 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'4';--
            elseif n=9 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'3';--
            elseif n=10 then return substr(IN_IDNUM,1,6)||'19'||substr(IN_IDNUM,7)||'2';--
            end if;
            return IN_IDNUM;
else
    v_return:= 'N';
end if;--
    return v_return;
end;
$$


可以参考下这些哈
http://t.csdn.cn/bzoNu
http://t.csdn.cn/Pd3pV