PostgreSQL错误:没有名为“(SQL状态42883)的内置函数

时间:2011-09-27 08:16:53

标签: postgresql plpgsql bigint

我正在尝试向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状态的信息,但不知道发生了什么。

提前致谢。

2 个答案:

答案 0 :(得分:4)

这里有两个错误:

  1. PostgreSQL像几乎所有其他数据库一样使用标准字符串连接运算符||
  2. PostgreSQL中没有convert函数,您应该使用to_char()将数字转换为字符串
  3. 顺便说一下:你知道PostgreSQL中有一个原生的IP数据类型吗?

答案 1 :(得分: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