我正try 使用函数从动态表中提取数据,但得到错误:"SQL Error[42704]:Error:TYPE"schemaName.p_Dynamicablename"不存在".

CREATE OR REPLACE FUNCTION schemaName."GetAllDataFromDynamicTable"(IN P_DynamicTableName text, IN id integer)
    RETURNS SETOF schemaName."P_DynamicTableName" 
AS $$
BEGIN
  return query
    SELECT * FROM schemaName."P_DynamicTableName" WHERE "Id" = id;
END;
$$
LANGUAGE plpgsql;

我正try 使用存储的过程从动态表中提取数据,但收到错误:"SQL Error[42704]:Error:Type"ml.ableName"is""

注意:能够从表中获取数据.例如:SELECT*FROMSCHEMA NAME."TableName";

CREATE OR REPLACE FUNCTION schemaName."GetAllDataFromDynamicTable"(tableName character varying)
  RETURNS SETOF schemaName."tableName" 
as $$
BEGIN
  return query 
    select * from schemaName."tableName";
END;
$$
LANGUAGE plpgsql;

推荐答案

正如@禤浩焯所说,动态SQL可以是一种解决方案:

CREATE OR REPLACE FUNCTION GetAllDataFromDynamicTable(IN P_DynamicTableName text, IN id integer)
    RETURNS SETOF record
AS $$
BEGIN
  RETURN QUERY
    EXECUTE FORMAT('SELECT * FROM %I WHERE id = %s', P_DynamicTableName, id) ;
END;
$$
LANGUAGE plpgsql;

但是,在显式定义该函数的输出列之前,调用该函数将导致错误.这仅在所有要动态查询的表都具有相同的列定义的情况下才有可能.

解决方法是将输出记录转换为JSON对象:

CREATE OR REPLACE FUNCTION NewGetAllDataFromDynamicTable(IN P_DynamicTableName text, IN id integer)
    RETURNS SETOF jsonb
AS $$
BEGIN
  RETURN QUERY
    EXECUTE FORMAT('SELECT to_jsonb(t.*) FROM %I AS t WHERE t.id = %s', P_DynamicTableName, id) ;
END;
$$
LANGUAGE plpgsql;

然后,您可以通过不同的方式调用该函数:

SELECT t.* FROM NewGetAllDataFromDynamicTable ('test', 1) AS t将返回json对象.

SELECT (jsonb_populate_record(NULL :: "test", t.*)).* FROM NewGetAllDataFromDynamicTable ('test', 1) AS t将返回表test的列

dbfiddle

Postgresql相关问答推荐

PostgreSQL按描述请求

如何在查询空字段时设置pgtype.comb为默认值?

PostgreSQL散列连接与嵌套循环和散列索引

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

PostgreSQL存储过程中不存在游标

将CSV文件复制到临时表

如何在 PostgreSQL 的回归测试中测试 TYPE 发送和接收函数

PostgreSQL SELECT 结果具有不同的 id,它更喜欢来自另一个表的特定值

PostgreSQL比较两个jsonb对象

在 to_tsquery 中转义特殊字符

在postgres的同一列中存储不同数据类型的合理方法?

带有双引号的 postgresql COPY 和 CSV 数据

是否可以在 Postgres 中存储一个 1 字节的数字?

从 PostgreSQL 中的数字获取月份名称

datagrip 无法应用更改 此表是只读的

如何在 Postgresql 中正确使用 FETCH FIRST?

如何在 postgres 中使用 json_populate_recordset 解析 json

在 PostgreSQL 中跳过每 n 个结果行

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)

使用 Hibernate 注释映射 PostgreSQL 串行类型