chr*_*oes 2 postgresql plpgsql
我需要一个 PL/pgSQL 函数,它将 IP 地址作为文本,并向其中添加给定的整数值,并根据需要传递八位字节。
我已经有一个用 JavaScript 编写的工作版本:
export const incrementIpAddress = (ipAddress: string, amount: number) => {
const octets = ipAddress.split('.');
const numbers = octets.map(octet => parseInt(octet));
let carry = amount;
for(let i = numbers.length - 1; i >= 0 && carry > 0; i--) {
const sum = numbers[i] + carry;
numbers[i] = sum % 256;
carry = Math.floor(sum / 256);
}
return numbers.join('.');
}
Run Code Online (Sandbox Code Playgroud)
我尝试让 ChatGPT 将其转换为 PL/pgSQL(我知道,我很抱歉),这就是它的结果:
CREATE OR REPLACE FUNCTION increment_ip_address(ip_address text, amount integer) RETURNS text AS $$
DECLARE
octets text[];
numbers integer[];
carry integer;
i integer;
BEGIN
octets := string_to_array(ip_address, '.');
FOREACH i IN ARRAY octets LOOP
numbers := numbers || i::integer;
END LOOP;
carry := amount;
FOR i IN REVERSE 1 .. array_upper(numbers, 1) LOOP
numbers[i] := numbers[i] + carry;
carry := FLOOR(numbers[i] / 256);
numbers[i] := numbers[i] % 256;
END LOOP;
RETURN array_to_string(numbers, '.')::text;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用,并且始终输出与给定的 IP 相同的 IP,而不是递增的。我可以获得一些帮助来使这个功能发挥作用吗?
PostgreSQL 有一个内置inet类型,您可以将其用于确切的目的。它可以按照您的预期与+操作员一起使用,并添加适当的结转行为:演示
select '127.0.0.255'::inet+23;
--127.0.1.22
Run Code Online (Sandbox Code Playgroud)