【问题标题】:PostgreSQL ERROR: there is no built-in function named " (SQL state 42883)PostgreSQL 错误:没有名为“的内置函数(SQL 状态 42883)
【发布时间】:2011-09-27 08:16:52
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: postgresql plpgsql bigint


    【解决方案1】:

    这里有两个错误:

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

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

    【讨论】:

      【解决方案2】:

      除了 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 2016-01-30
        • 2020-04-14
        • 2022-10-06
        相关资源
        最近更新 更多