Sql 从Postgres中的动态查询插入

Sql 从Postgres中的动态查询插入,sql,postgresql,dynamic-sql,Sql,Postgresql,Dynamic Sql,我在上一篇文章中发布的参考解决方案导致了另一种情况。 在尝试插入目标表模式时,如下所示 -- Table: normalized_transaction -- DROP TABLE normalized_transaction; CREATE TABLE normalized_transaction ( transaction_id uuid, file_id uuid, account_number character varying(40), currency chara

我在上一篇文章中发布的参考解决方案导致了另一种情况。 在尝试插入目标表模式时,如下所示

-- Table: normalized_transaction

-- DROP TABLE normalized_transaction;

CREATE TABLE normalized_transaction
(
  transaction_id uuid,
  file_id uuid,
  account_number character varying(40),
  currency character varying(3),
  trade_date date,
  value_date date,
  narration character varying(200),
  amount numeric,
  mesitis_account_number character varying(50),
  tag character varying(255),
  supporting_file_id uuid,
  supporting_record_id uuid,
  status integer DEFAULT 0,
  source_type integer,
  record_index integer DEFAULT 0
)
使用如下查询

INSERT INTO normalized_transaction(account_number, currency, trade_date)
select gen_Test('english');
fetch all in english;
导致错误:

ERROR:  INSERT has more target columns than expressions
LINE 2: ...NSERT INTO normalized_transaction(account_number, currency, ...
                                                             ^
********** Error **********

ERROR: INSERT has more target columns than expressions
SQL state: 42601
Character: 53



select gen_Test('english');
    fetch all in english;
将此结果插入表中的适当方法是什么。

您可以这样尝试:

INSERT INTO normalized_transaction(account_number, currency, trade_date)
SELECT foo.*
FROM gen_Test('english') as foo;

检查选择gen_测试“英语”的输出;它是否返回相同的相应列帐号、货币、交易日期?。我想你已经定义了它的功能。您可以在函数本身中写入insert。@compyutech select gen_测试“english”将返回“english”,作为光标的传递名称。关于建议**在函数**中插入内容的情况,可以是函数是静态的,也可以是一个表。此函数设计用于以动态方式输出具有任何列的任何表的查询结果,并进一步利用它插入到目标。根据您对案例的建议,拥有100个表将需要为每个表创建100个函数。您对我的建议的看法很好。但我对从函数返回的结果感到困惑,若它并没有以相同的列顺序返回数据,我们就不能在目标表中插入。你能分享你的函数的create语句吗?这样我就可以从我的身边检查它一次。@compyutech Create或replace函数gen\u Testquery\u name refcursor将refcursor返回为$$Declare sql text;begin sql:=选择“SELECT'| | string_Aggcol_src',“tbl| src FROM md|U format='Dbs'GROUP BY tbl_src”;打开执行sql的查询名称;返回查询单元名称;完;$$语言plpgsql;选择gen_测试“英语”;全部用英语取;尝试更改选择gen_测试。。。要从gen_测试中选择*。。。。第一个表单永远不会生成多个列。从gen_测试“english”中选择foo.*作为foo;他只会说英语。这不是表值函数,而是在其中调用游标的函数,游标名称作为参数传递。