我想把我的pl / pgsql脚本输出到屏幕上

时间:2012-08-09 18:58:08

标签: postgresql for-loop plpgsql

我有以下脚本要输出到屏幕。

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。

2 个答案:

答案 0 :(得分:5)

假设您希望将insert函数的返回值和rec.name放入另一个表中。您可以执行以下操作(首先createnew_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的函数体)。