如何解决使用函数/过程
我正在编写一个 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') ;
$$;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。