2012-08-09 67 views
3

我有我想要输出到屏幕的以下脚本。我想要我的pl/pgsql脚本输出到屏幕

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来代替。

回答

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的函数体)。

+0

谢谢!我会试试这个。 – 2012-08-09 21:11:02

+0

我无法在函数之外做一个for循环。 – 2012-08-09 21:25:04

+0

没关系,我只注意到你的解决方案不需要for循环。 – 2012-08-09 21:39:35

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;,在甲骨文方面,它是SELECT sequence_name.nextval FROM dual;SELECT function() FROM dual;postgreSQL中没有dual

我也觉得ORDER BY是没有必要的,因为我的假设是你的函数levenshtein()将最有可能在任何时间点返回只有一个值,因此不会有足够的数据来ORDER

+0

我不想将它存储在不同的表中。我想看看输出。 – 2012-08-09 19:07:22

+0

您可以在函数内部使用'dbms_output.put_line'来查看输出,但我不推荐它。而是使用我在答案中更新的PLSQL块来查看值。查看更新后的答案。 – Annjawn 2012-08-09 19:12:50

+0

最后一行斜杠的功能是什么? – 2012-08-09 19:14:45