postgresql 如何在Postgres函数中绑定变量?

fhg3lkii  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(168)

下面是我的代码:

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 = '$1'::regclass$$
    using viewname;
END;

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

zd287kbt

zd287kbt1#

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 = $1
   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。
函数名是误导性的。你可以通过这种方式获得任何注册关系的列,而不仅仅是视图。
进一步阅读:

  • 如何在Postgres中列出视图的列?
  • 表名作为PostgreSQL函数参数

相关问题