我需要一个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('.');
}

我try 让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;

然而,这并不起作用,并且始终输出与给定的相同的IP,而不是递增的.我可以得到一些帮助来使这个函数工作吗?

推荐答案

PostgreSQL有一个built-in inet type,你可以使用它来达到这个目的.正如你所预期的那样,它可以与+ operator一起工作,并增加了适当的结转行为:demo

select '127.0.0.255'::inet+23;
--127.0.1.22

Postgresql相关问答推荐

Postgs SQL用于比较两个表之间的数据并填充到目标中

PostgreSQL:函数结果表内冲突(...)上的";中的字段名称

DBT-DBT依赖于未找到的源

使函数内部动态插入更具可读性

在PostgreSQL中,`MY_VARIABLE IN(<;Long_ARRAY_of_Items>;)`何时是FAST?

单个WAL文件中的操作会影响哪些表和多少行

PostgreSQL 中的 Datum 数据类型是什么以及它的用途是什么?

PostgreSQL pg_dump 创建 sql 脚本,但它不是 sql 脚本:有没有办法让 pg_dump 创建标准的 sql 脚本?

我可以在 Ruby on Rails 上编写 PostgreSQL 函数吗?

PG::UndefinedTable:错误:relation "active_storage_blobs" does not exist

sql:转换参数 $1 类型:不支持的类型 []int,in 的一部分

从 Postgres 字段中的多个值中进行 Select

带有初始数据的 docker postgres 不会在提交中持久化

如何使 Java 和 Postgres 枚举一起工作以进行更新?

将 SELECT 结果作为参数传递给 postgreSQL 函数

Postgres 删除表语法错误

与 Oracle 的 CONNECT BY ... START WITH 等效的 PostgreSQL 语法是什么?

在 postgres 中创建超级用户

Postgres 数据库文件保存在 ubuntu 中的什么位置?

Rails PG::UndefinedTable:错误:missing FROM-clause entry for table