0

IPアドレスを整数からテキスト形式に変換するための非常に単純な関数をPostgreSQLに追加しようとしています。

これは関数のコードです:

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

ここには 2 つのエラーがあります。

  1. PostgreSQL は、||他のほとんどすべてのデータベースと同様に、標準の文字列連結演算子を使用します。
  2. convertPostgreSQL には関数がありません。数値を文字列に変換するには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 に答える