【问题标题】:Vertica: Create Recursive FunctionVertica:创建递归函数
【发布时间】:2021-03-16 14:57:13
【问题描述】:

我正在尝试解决 Vertica 的 HEX_TO_BINARY 函数仅支持 VARCHAR 而不支持 LONG VARCHAR 的问题。

我正在尝试创建一个递归 SQL 函数来解决这个问题。

CREATE OR REPLACE FUNCTION LONG_HEX_TO_BINARY(HEX_VALUE LONG VARCHAR) RETURN LONG VARBINARY
AS
BEGIN
   RETURN (CASE WHEN (LENGTH(HEX_VALUE) > 65000) THEN (HEX_TO_BINARY(CAST(SUBSTR(HEX_VALUE,1,65000) as VARCHAR(65000))) || LONG_HEX_TO_BINARY(SUBSTR(HEX_VALUE,65001))) ELSE HEX_TO_BINARY(CAST(HEX_VALUE AS VARCHAR(65000)))  END);
END;

但是,当我尝试编译它(使用 psql)时,我得到了

ERROR:  Syntax error at or near "EOL"

使用 Vertica 的 vsql 客户端我得到

ROLLBACK 3457: Function LONG_HEX_TO_BINARY(long varchar) does not exist, or permission is denied for LONG_HEX_TO_BINARY(long varchar) HINT: No function matches the given name and argument types. You may need to add explicit type casts

任何想法,是否允许创建递归函数?

【问题讨论】:

    标签: function vertica


    【解决方案1】:

    这似乎有效

    首先创建一个“虚拟”函数来建立签名

    dbadmin=> CREATE OR REPLACE FUNCTION LONG_HEX_TO_BINARY(HEX_VALUE LONG VARCHAR)
    dbadmin-> RETURN LONG VARBINARY
    dbadmin-> AS
    dbadmin-> begin
    dbadmin->    return NULL;
    dbadmin-> end;
    CREATE FUNCTION
    dbadmin=> /
    

    现在用真正的函数替换它

    dbadmin=> CREATE OR REPLACE FUNCTION LONG_HEX_TO_BINARY(HEX_VALUE LONG VARCHAR)
    dbadmin-> RETURN LONG VARBINARY
    dbadmin-> AS
    dbadmin-> BEGIN
    dbadmin->    RETURN (
    dbadmin(>      CASE
    dbadmin(>        WHEN (LENGTH(HEX_VALUE) > 65000) THEN
    dbadmin(>      (HEX_TO_BINARY(CAST(SUBSTR(HEX_VALUE,1,65000) as VARCHAR(65000))) || LONG_HEX_TO_BINARY(SUBSTR(HEX_VALUE,65001)))
    dbadmin(>        ELSE
    dbadmin(>  HEX_TO_BINARY(CAST(HEX_VALUE AS VARCHAR(65000)))
    dbadmin(>   END
    dbadmin(> );
    dbadmin-> END;
    CREATE FUNCTION
    

    现在看看它是否真的有效..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2021-04-18
      • 2020-05-30
      相关资源
      最近更新 更多