我有以下脚本要输出到屏幕。
CREATE OR REPLACE FUNCTION randomnametest() RETURNS integer AS $$
DECLARE
rec RECORD;
BEGIN
FOR rec IN SELECT * FROM my_table LOOP
SELECT levenshtein('mystring',lower('rec.Name')) ORDER BY levenshtein;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
我想在表中连同rec.Name获取levenshein()函数的输出。我该怎么办?另外,它给我一个关于我称之为levenshtein()的行的错误,说我应该使用perform。
答案 0 :(得分:5)
假设您希望将insert
函数的返回值和rec.name
放入另一个表中。您可以执行以下操作(首先create
表new_tab
) -
SELECT levenshtein('mystring',lower(rec.Name)) AS L_val;
INSERT INTO new_tab (L_val, rec.name);
以上用法如下所示。
我想,您可以使用RAISE INFO 'This is %', rec.name;
来查看值。
CREATE OR REPLACE FUNCTION randomnametest() RETURNS integer AS $$
DECLARE
rec RECORD;
BEGIN
FOR rec IN SELECT * FROM my_table LOOP
SELECT levenshtein('mystring',lower(rec.Name))
AS L_val;
RAISE INFO '% - %', L_val, rec.name;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
注意 - FROM
子句是可选的,以防您从像netxval(sequence_name)
之类的选项中选择一个函数,并且没有任何实际的表可供选择,例如SELECT nextval(sequence_name) AS next_value;
,在Oracle术语中,它将是SELECT sequence_name.nextval FROM dual;
或SELECT function() FROM dual;
。 dual
中没有postgreSQL
。
我还认为ORDER BY
不是必需的,因为我的假设是你的函数levenshtein()
很可能在任何时候只返回一个值,因此没有足够的数据到ORDER
。
答案 1 :(得分:3)
如果你希望plpgsql函数的输出如标题所示:
CREATE OR REPLACE FUNCTION randomnametest(_mystring text)
RETURNS TABLE (l_dist int, name text) AS
$BODY$
BEGIN
RETURN QUERY
SELECT levenshtein(_mystring, lower(t.name)), t.name
FROM my_table t
ORDER BY 1;
END;
$$ LANGUAGE plpgsql;
RETURNS TABLE
声明表格。RETURN QUERY
从函数中返回记录。OUT
参数(来自RETURNS TABLE
子句)之间的冲突。 OUT
参数在函数体中随处可见。还有其他方法,但这对任务来说是最有效的。你需要PostgreSQL 8.4或更高版本。
对于一次性使用,我会考虑使用普通查询(=上面没有RETURN QUERY
的函数体)。