代码之家  ›  专栏  ›  技术社区  ›  Thorsten Schöning

如何在创建类型中使用原始Postgres input/output_函数?

  •  2
  • Thorsten Schöning  · 技术社区  · 8 年前

    我有一张表格,上面有一些类型的列 smallint 并希望提供一个 CAST varchar 短整型 为了我的需要,我需要一个特殊专栏的类型。已经尝试使用域,但Postgres警告说,在 演员阵容 CREATE TYPE ,但我不想自己实现所需的input/output_函数,因为最终我只需要应该已经可用的东西 短整型 在Postgres中。

    问题是我不知道这些函数的名称,它们存储在哪个lib中,如果我需要提供在不同操作系统上安装时可能不同的路径,或者这些路径是否可用。

    那么,有没有可能 创建类型 类似于 哪种完全只使用Postgres函数,并且以平台/路径独立的方式使用Postgres函数?

    我没有发现有人做那样的事。谢谢

    1 回复  |  直到 8 年前
        1
  •  3
  •   Laurenz Albe    8 年前

    你可以创建一个类型,就像 smallint

    CREATE TYPE myint;
    
    CREATE FUNCTION myintin(cstring) RETURNS myint
       LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2in';
    
    CREATE FUNCTION myintout(myint) RETURNS cstring
       LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2out';
    
    CREATE FUNCTION myintrecv(internal) RETURNS myint
       LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2recv';
    
    CREATE FUNCTION myintsend(myint) RETURNS bytea
       LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2send';
    
    CREATE TYPE myint (
       INPUT = myintin,
       OUTPUT = myintout,
       RECEIVE = myintrecv,
       SEND = myintsend,
       LIKE = smallint,
       CATEGORY = 'N',
       PREFERRED = FALSE,
       DELIMITER = ',',
       COLLATABLE = FALSE
    );
    

    如果要在算术表达式中使用强制转换,则必须定义对其他数值类型的强制转换。

    如果您还添加了来自 varchar text ),但请注意,在类型解析期间,创建太多类型转换可能会导致歧义和令人惊讶的行为。这就是为什么PostgreSQL 8.3中删除了许多类型转换的原因,请参阅 release notes .