在 Vertica 中创建函数问题

问题描述 投票:0回答:1

我想创建这个功能但面临问题

CREATE OR REPLACE FUNCTION RAW.getType(input_string VARCHAR)
RETURN VARCHAR AS
BEGIN
   RETURN (
        SELECT Type
        FROM RAW.TYPE
        WHERE LENGTH(input_string) = LENGTH  
          AND input_string LIKE PATTERN || '%' 
         LIMIT 1 
     );
 END;

由于列“input_string”不存在而出现错误

也尝试过声明结果

CREATE OR REPLACE FUNCTION RAW.getType(num VARCHAR)
RETURN VARCHAR
AS
BEGIN
    DECLARE result VARCHAR;

    SELECT Type INTO result
    FROM RAW.TYPE
    WHERE LENGTH(num) = LENGTH  
      AND num LIKE PATTERN || '%'  
    LIMIT 1;  

    RETURN result;
END;

这给出了语法错误

需要为上面的选择查询创建函数查询

function vertica
1个回答
0
投票

您需要将 SELECT-s 打包到 PROCEDURE 中,而不是 Vertica 中的 FUNCTION 中。

不过,您可以使用 inout 参数 - 我不能说它们是否符合您的目的,因为您不能,例如,将它们嵌入到不在查询顶层的 SELECT 中。但这是有效的:

CREATE TABLE IF NOT EXISTS raw.type (srch,type) AS (
            SELECT 'aaaaaaa',1
  UNION ALL SELECT 'bbbbbbb',2
  UNION ALL SELECT 'ccccccc',3
  UNION ALL SELECT 'ddddddd',4
  UNION ALL SELECT 'eeeeeee',5
);
-- out CREATE TABLE
-- out Time: First fetch (0 rows): 10.143 ms. All rows formatted: 10.203 ms

CREATE OR REPLACE PROCEDURE raw.getType(
 INOUT input_string VARCHAR
,OUT _type INT
) LANGUAGE PLvSQL SECURITY INVOKER AS $$
BEGIN
RAISE NOTICE 'searching with  %', input_string;
     SELECT srch,type
     INTO input_string,_type
     FROM raw.type
     WHERE srch LIKE input_string || '%' ;
END;
$$;
-- out CREATE PROCEDURE
-- out Time: First fetch (0 rows): 16.096 ms. All rows formatted: 16.197 ms

CALL raw.getType('d');
-- out NOTICE 2005:  searching with  d
-- out  input_string | _type 
-- out --------------+-------
-- out  ddddddd      |     4
-- out (1 row)
-- out 
-- out Time: First fetch (1 row): 81.213 ms. All rows formatted: 81.338 ms                  
© www.soinside.com 2019 - 2024. All rights reserved.