我正在尝试向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状态的信息,但不知道发生了什么。
提前致谢。
答案 0 :(得分:4)
这里有两个错误:
答案 1 :(得分:0)
除了a_horse_with_no_name已经指出的内容之外:
language plpgsql
代替language internal
tinyint
。在PostgreSQL中使用smallint
或int2
(同义词)代替。请参阅manual about data types。更好的是,在这种特殊情况下制作所有变量bigint
并节省额外的转换。:=
代替=
。 =
未记录,可能会在未来版本中停止工作,恕不另行通知。见这里:The forgotten assignment operator "=" and the commonplace ":=" END;
移至最后。IMMUTABLE
加快速度。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