Function 参数值被视为数据类型-PL/pgSQL

Function 参数值被视为数据类型-PL/pgSQL,function,plpgsql,Function,Plpgsql,我不熟悉使用PL/pgSQL。在过去的3年里,我一直是一名SQL Server开发人员。我正在尝试使用动态SQL编写一个函数,传入一个表名,然后将一个值和该表名返回 我仍在试图弄清楚如何在PostgreSQL中编写存储过程和函数,但我找不到任何文档说明如何这样做 CREATE OR REPLACE FUNCTION exc_tables (tname VARCHAR) RETURNS TABLE (module_id bigint, tablename varchar) AS $$ BEGIN

我不熟悉使用PL/pgSQL。在过去的3年里,我一直是一名SQL Server开发人员。我正在尝试使用动态SQL编写一个函数,传入一个表名,然后将一个值和该表名返回

我仍在试图弄清楚如何在PostgreSQL中编写存储过程和函数,但我找不到任何文档说明如何这样做

CREATE OR REPLACE FUNCTION exc_tables (tname VARCHAR)
RETURNS TABLE (module_id bigint, tablename varchar) AS $$
BEGIN
  RETURN QUERY EXECUTE format('SELECT DISTINCT module_id, '||CAST(tname AS varchar)||' as tablename FROM ' || tname || ' WHERE module_ID <> 6');

END;
$$
LANGUAGE plpgsql;

SQL Error [42804]: ERROR: structure of query does not match function result type
  Detail: Returned type dt_conn_type does not match expected type character varying in column 2.
  Where: PL/pgSQL function exc_tables(character varying) line 3 at RETURN QUERY
创建或替换函数exc_表(tname VARCHAR)
将表(module_id bigint,tablename varchar)返回为$$
开始
返回查询执行格式('SELECT DISTINCT module|id',|CAST(tname AS varchar)| |作为“| tname | | WHERE module|id 6”中的表名);
结束;
$$
语言plpgsql;
SQL错误[42804]:错误:查询的结构与函数结果类型不匹配
详细信息:返回的类型dt_conn_type与第2列中的预期类型字符不匹配。
其中:PL/pgSQL函数exc_表(字符变化)返回查询时的第3行

您需要将
cast()放入查询中

...
RETURN QUERY EXECUTE format('SELECT DISTINCT module_id, CAST('''||tname||''' AS varchar) as tablename FROM ' || tname || ' WHERE module_ID <> 6');
...
但您需要确保在查询中用单引号将其括起来,使其成为字符串文字,否则它意味着整个记录(该记录的类型为
tname
,因此不是
varchar


顺便说一句,使用
format()
只包含一个无占位符的格式字符串,而不包含替换参数也是毫无用处的。

您需要将
cast()
放入查询中

...
RETURN QUERY EXECUTE format('SELECT DISTINCT module_id, CAST('''||tname||''' AS varchar) as tablename FROM ' || tname || ' WHERE module_ID <> 6');
...
但您需要确保在查询中用单引号将其括起来,使其成为字符串文字,否则它意味着整个记录(该记录的类型为
tname
,因此不是
varchar

顺便说一句,使用
format()
,只使用一个无占位符的格式字符串,而不使用替换参数也是非常无用的