gpt4 book ai didi

sql - 在 PostgreSQL 中使用动态 SQL 查询返回表

转载 作者:行者123 更新时间:2023-11-29 12:05:52 28 4
gpt4 key购买 nike

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

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)"

要求的输出:

enter image description here

请帮助我,在此先感谢。

最佳答案

你必须使用 SELECT FROM

SELECT * FROM get_weather('Prague');postgres=# SELECT * FROM weather ;  city  │ lo │ hi │     d      ────────┼────┼────┼──────────── San Fr │ 46 │ 50 │ 2013-06-06(1 row)postgres=# SELECT * FROM get_weather('San Fr');  city  │ lo │ hi │     d      ────────┼────┼────┼──────────── San Fr │ 46 │ 50 │ 2013-06-06(1 row)postgres=# \sf get_weather CREATE OR REPLACE FUNCTION public.get_weather(city text) RETURNS weather LANGUAGE plpgsqlAS $function$DECLARErec RECORD;BEGINEXECUTE 'SELECT * FROM weather WHERE city = $1' INTO rec USING sity;RETURN rec;END;$function$

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

  • 使用返回查询执行
  • 永远不要使用动态查询 - 使用 RETURN QUERY
  • 对单行函数使用 SQL 语言而不是 PL/pgSQL
CREATE OR REPLACE FUNCTION get_weather(city text)RETURNS weather AS $$SELECT * FROM weather WHERE city = $1;$$ LANGUAGE sql;

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

改用

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

或更好

EXECUTE 'SELECT * FROM weather WHERE city = $1'  INTO rec USING city;

关于sql - 在 PostgreSQL 中使用动态 SQL 查询返回表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16954206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com