2017-07-19 40 views
0

我有一个表smallint类型的某些列,并希望提供从varchar一个CASTsmallint到实施只列了一些转换。所以为了能够根据我的需要创建一个特定的CAST,我需要一个特殊列的类型。使用域已经尝试过,但Postgres的警告那些在CAST被忽略......因此,它看起来像我坚持了CREATE TYPE,但我不希望实现我自己所需要的输入/ output_function用,如我只需要Postgres中已有的smallint如何在CREATE TYPE中使用原始的Postgres输入/输出功能?

的问题是我不知道的那些功能,其中LIB这些名称都存储,如果我需要提供能够在不同的操作系统或者如果这些都可以在所有安装时有所不同的路径。

那么,是否有可能CREATE TYPEsmallint这样的东西,它完全只使用Postgres函数,并在平台/路径无关的方式?

我没有找到任何人做这样的事情。谢谢!

回答

0

您可以创建一个类型,就像是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

我建议你找一个简单的解决问题的方法,比如明确的类型转换。