3

我有以下脚本,我想从中输出到屏幕。

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;

我想在表中获取 levenshein() 函数的输出以及rec.Name。我该怎么做?此外,它给了我一个关于我调用 levenshtein() 的行的错误,说我应该改用 perform。

4

2 回答 2

6

假设你想把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如果您从 select like 中的函数中选择netxval(sequence_name)并且没有任何实际表可供选择,即 like SELECT nextval(sequence_name) AS next_value;,则该子句是可选的,在 Oracle 术语中它将是SELECT sequence_name.nextval FROM dual;or SELECT function() FROM dual;dual中没有postgreSQL

我还认为这ORDER BY不是必需的,因为我的假设是您的函数levenshtein()很可能在任何时间点都只返回一个值,因此没有足够的数据来ORDER.

于 2012-08-09T19:03:16.413 回答
4

如果你想要一个 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上述内容的函数体)。

于 2012-08-09T20:51:46.923 回答