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

Parameter Value is being treated as a data type - PL/pgSQL

我刚开始使用 PL/pgSQL。在过去的 3 年里,我一直是 SQL 服务器开发人员。我正在尝试使用 Dynamic SQL 编写一个函数以传入 table 名称,然后传递一个值,然后返回 table 名称。

我仍在尝试弄清楚如何在 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

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

...
RETURN QUERY EXECUTE format('SELECT DISTINCT module_id, CAST('''||tname||''' AS varchar) as tablename FROM ' || tname || ' WHERE module_ID <> 6');
...

但是因为它已经是 varchar 演员表是无用的,你可以继续:

RETURN QUERY EXECUTE format('SELECT DISTINCT module_id, '''||tname||''' as tablename FROM ' || tname || ' WHERE module_ID <> 6');

但是你需要确保在查询中用单引号将它括起来,使它成为一个字符串文字,否则它意味着整个记录(它具有 tname 的类型,所以不是varchar).

顺便说一句,仅使用无占位符格式字符串且没有替换参数的 format() 也毫无用处。