如何在 postgres 函数中绑定变量

How do I bind a variable in postgres functions

这是我的代码:

CREATE OR REPLACE FUNCTION public.view_columns_f(viewname text)
 RETURNS TABLE(columnn_name text, data_type text)
 LANGUAGE plpgsql
AS $function$
BEGIN
    
    return query execute
    $$SELECT attname, format_type(atttypid, atttypmod) AS data_type
FROM   pg_attribute
WHERE  attrelid = ''::regclass$$ using viewname ;

END;

错误是关系“$1”不存在,因为我没有正确绑定它。

Adrian 指出了几个问题,我又修复了几个:

CREATE OR REPLACE FUNCTION public.view_columns_f(viewname regclass)
  RETURNS TABLE (columnn_name name, data_type text)
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY
   SELECT attname, format_type(atttypid, atttypmod)  -- AS data_type
   FROM   pg_attribute
   WHERE  attrelid = 
   AND    NOT attisdropped  -- exclude deleted columns
   AND    attnum > 0        -- exclude internal system columns
   ORDER  BY attnum;        -- original order
END
$func$;

通话:

SELECT * FROM public.view_columns_f('my_view');

最重要的是,幸运的是,您根本不需要动态 SQL。在玩更棘手的动态 SQL.

之前,先掌握普通 PL/pgSQL

可能是一个更简单的 SQL 函数,不需要 PL/pgSQL.

函数名称具有误导性。您可以通过这种方式获得任何已注册关系的列,而不仅仅是视图。

延伸阅读:

  • Table name as a PostgreSQL function parameter