CREATE OR REPLACE FUNCTION display_columns_data(table_name varchar, columns_to_display varchar[])
RETURNS TABLE (result_row json) AS
$$
BEGIN
RETURN QUERY EXECUTE
'SELECT ' || array_to_string(columns_to_display, ',') || ' FROM ' || table_name;
END;
$$
LANGUAGE plpgsql;
SELECT * FROM display_columns_data('employees', ARRAY['first_name', 'last_name']);
Detail: Returned type character varying(20) does not match expected type json in column 1.
Where: SQL statement "SELECT first_name,last_name FROM employees"
PL/pgSQL function display_columns_data(character varying,character varying\[\]) line 3 at RETURN QUERY
3条答案
按热度按时间zc0qhyus1#
该方法中的SQL查询返回一个结果集,其中包含类型为charactervarying(20)或字符串的列,这就是您遇到问题的原因。函数display_columns_data的目的是返回一个表,表中只有一个json类型的列。这个问题是由定义的返回类型和实际结果集之间的差异引起的。
尝试使用此代码进行函数定义;
上述代码中的RETURNS TABLE子句指定该函数应生成一个表,该表具有一个名为result_row的单列,其类型为record。这将匹配动态SQL查询生成的结果集,该结果集可能具有不同类型的列,具体取决于输入columns_to_display。
希望它能起作用:)
lh80um4z2#
如果你想返回一个JSON对象,你必须在
SELECT
语句中将列转换为JSON;vm0i2vca3#
这将返回一组JSON值,每个值用给定的列名 Package 一行,同时将所述列名保留为键名。安全:
请注意我是如何解开列名数组并分别通过
quote_ident()
运行它们以关闭SQL注入的大门的,这是敞开的。列名必须不加引号且区分大小写。请参阅: