我想创建这个功能但面临问题
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;
这给出了语法错误
需要为上面的选择查询创建函数查询
您需要将 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