微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用函数/过程

如何解决使用函数/过程

我正在编写一个 postgresql 函数/过程来将表中的 IPv4 列转换为另一个表的十六进制。

将 IPv4 转换为十六进制的函数:-

CREATE OR REPLACE FUNCTION IPTOHEX(ip in varchar) returns varchar as $iptohex$
DECLARE
period1st NUMERIC(3);
period2nd NUMERIC(3);
period3rd NUMERIC(3);
period4th NUMERIC(3);
octet1st varchar(3);
octet2nd varchar(3);
octet3rd varchar(3);
octet4th varchar(3);
hex1st NUMERIC(3);
hex2nd NUMERIC(3);
hex3rd NUMERIC(3);
hex4th NUMERIC(3);
hex varchar(8);
begin
         period1st := split_part(ip,'.',1);
         period2nd := split_part(ip,2);
         period3rd := split_part(ip,3);
     period4th := split_part(ip,4);
     hex1st := to_hex(period1st);
     hex2nd := to_hex(period2nd);
     hex3rd := to_hex(period3rd);
     hex4th := to_hex(period4th);
         octet1st := lpad(hex1st,2,'0');
         octet2nd := lpad(hex2nd,'0');
         octet3rd := lpad(hex3rd,'0');
         octet4th := lpad(hex4th,'0');
         hex := upper(octet1st || octet2nd || octet3rd || octet4th);
         return(hex);
end;
$iptohex$ LANGUAGE plpgsql;

由 IPv4 地址组成的表 - sample1 由 5 列组成,其中 3 列是 IPv4 地址。所以每当我添加删除或更新 sample1 中的行,那么同样应该在 sample2 表中完成,但为十六进制。所以我写了下面的程序来转换 sample1 表中的列值。

CREATE OR REPLACE FUNCTION IPTOHEXA() RETURNS TRIGGER AS $iptohexa$
   BEGIN
                DELETE FROM sample2;
            DECLARE
              range_cur CURSOR  IS
               SELECT subnet_address_range,subnet_address_start,subnet_address_end,subnet_mask_length,fno_tadig_code FROM sample1;
            BEGIN
               FOR range_rec IN range_cur LOOP
                INSERT INTO sample2 VALUES(iptohex(range_rec.subnet_address_range),range_rec.subnet_mask_length,iptohex(range_rec.subnet_address_start),iptohex(range_rec.subnet_address_end),range_rec.fno_tadig_code);
              END LOOP;
            END;
            END;
   $iptohexa$ LANGUAGE plpgsql;

我在 sample1 表上使用以下触发器

CREATE TRIGGER EL_SOURCE_FNO_IP_ADDRESS_TRIG1
AFTER INSERT OR UPDATE OR DELETE ON SOURCE_FNO_IP_ADDRESS FOR EACH ROW EXECUTE PROCEDURE IPTOHEXA();

但是我在尝试在 sample1 表中插入行时出现错误

eventlink=>  INSERT INTO sample1 values('1.66.0.0','22','1.66.0.0','1.66.3.255','JPNDO');
ERROR:  function to_hex(numeric) does not exist
LINE 1: SELECT to_hex(period1st)
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  SELECT to_hex(period1st)
CONTEXT:  PL/pgsql function iptohex(character varying) line 21 at assignment
sql statement "INSERT INTO sample2 VALUES(iptohex(range_rec.subnet_address_range),range_rec.fno_tadig_code)"
PL/pgsql function iptohexa() line 9 at sql statement

有人可以帮我整理这个错误吗? 提前致谢。

解决方法

不错的函数,但是通过级联函数调用,可以将其重新使用为单个语句。那么函数本身就可以转换成SQL函数了。

create or replace 
function ip4_to_hex(ip4_in text)
  returns text
 language sql
 immutable strict
as $$  
select lpad(to_hex(split_part(ip4_in,'.',1)::int),2,'0') || 
       lpad(to_hex(split_part(ip4_in,2)::int),'0') ||
       lpad(to_hex(split_part(ip4_in,3)::int),4)::int),'0') ;
$$;  

example here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。