0

我正在尝试向我的 PostgreSQL 添加一个非常简单的函数,将 IP 地址从整数转换为文本格式。

这是函数的代码:

CREATE FUNCTION  custom_int_to_ip(ip BIGINT)
RETURNS TEXT
AS
$$
DECLARE
octet1 BIGINT;
octet2 TINYINT;
octet3 TINYINT;
octet4 TINYINT;
restofip BIGINT;
BEGIN
octet1 = ip / 16777216;
restofip = ip - (octet1 * 16777216);
octet2 = restofip / 65536;
restofip  = restofip - (octet2 * 65536);
octet3 = restofip / 256;
octet4 = restofip - (octet3 * 256);
END; 
RETURN(CONVERT(TEXT, octet1) + '.' +
CONVERT(TEXT, octet2) + '.' +
CONVERT(TEXT, octet3) + '.' +
CONVERT(TEXT, octet4));
$$
LANGUAGE internal;

作为重播,我收到以下错误:

ERROR: there is no built-in function named "

下面的一些行...

SQL state: 42883

请让我知道是否有人可以在这里看到我的错误,我一直在尝试不同的语法并搜索特定 SQL 状态的信息,但不知道发生了什么。

提前致谢。

4

2 回答 2

4

这里有两个错误:

  1. ||PostgreSQL与几乎所有其他数据库一样使用标准字符串连接运算符
  2. PostgreSQL中没有convert函数,你应该使用to_char()将数字转换为字符串

顺便说一句:你知道 PostgreSQL 中有一个本地 IP 数据类型吗?

于 2011-09-27T08:36:05.290 回答
0

除了 a_horse_with_no_name 已经指出的内容:

总结一下:

CREATE OR REPLACE FUNCTION custom_int_to_ip(ip bigint)
RETURNS inet AS
$$
DECLARE
   octet1   bigint;
   octet2   bigint;
   octet3   bigint;
   octet4   bigint;
   restofip bigint;
BEGIN

octet1   := ip / 16777216;
restofip := ip - (octet1 * 16777216);
octet2   := restofip / 65536;
restofip := restofip - (octet2 * 65536);
octet3   := restofip / 256;
octet4   := restofip - (octet3 * 256);

RETURN (octet1::text || '.'
     || octet2::text || '.'
     || octet3::text || '.'
     || octet4::text);

END; 
$$
LANGUAGE plpgsql IMMUTABLE;

称呼:

SELECT custom_int_to_ip(1231231231);

输出:

73.99.24.255
于 2011-10-08T15:01:33.603 回答