3

下面是我执行一个动态查询的函数,但我在一个列中得到了这个查询的结果,所有值都用逗号分隔。

CREATE OR REPLACE FUNCTION get_weather(city text)
RETURNS weather AS $$
DECLARE
rec RECORD;
BEGIN
EXECUTE 'SELECT * FROM weather WHERE city = ''' || city || '''' INTO rec;
RETURN rec;
END;
$$ LANGUAGE plpgsql;

上述函数的结果:

"("San Francisco",46,50,0.25,1994-11-27)"

所需输出:

在此处输入图像描述

请帮助我,在此先感谢。

4

1 回答 1

5

你必须使用 SELECT FROM

SELECT * FROM get_weather('布拉格');

postgres=# SELECT * FROM 天气;
  城市 │ lo │ hi │ d      
────────┼────┼────┼────────────
 旧金山 │ 46 │ 50 │ 2013-06-06
(1 行)

postgres=# SELECT * FROM get_weather('San Fr');
  城市 │ lo │ hi │ d      
────────┼────┼────┼────────────
 旧金山 │ 46 │ 50 │ 2013-06-06
(1 行)

postgres=#\sf get_weather
创建或替换功能 public.get_weather(城市文本)
 返回天气
 语言 plpgsql
作为$函数$
宣布
记录记录;
开始
EXECUTE 'SELECT * FROM weather WHERE city = $1' INTO rec USING sity;
返回记录;
结尾;
$函数$

您的示例中有一些可能的优化

  • 使用返回查询执行
  • 永远不要使用动态查询 - 使用 RETURN QUERY
  • 对一行函数使用 SQL 语言而不是 PL/pgSQL
创建或替换函数 get_weather(城市文本)
返回天气 $$
SELECT * FROM weather WHERE city = $1;
$$ 语言 sql;

注意:更新的构建动态查询像你一样!这是 SQL 注入问题的示例。

改为使用

EXECUTE 'SELECT * FROM weather WHERE city = ' || quote_literal(city) INTO rec;

或更好

EXECUTE 'SELECT * FROM weather WHERE city = $1' INTO rec USING city;
于 2013-06-06T06:04:47.343 回答