Postgresql Postgres-在函数体中使用表名(传入参数)

Postgresql Postgres-在函数体中使用表名(传入参数),postgresql,function,Postgresql,Function,我是wrt函数的新手,正在努力在函数体中使用表的名称。当我使用调用函数时,得到一个错误“SQL错误[42703]:错误:列“tname”不存在” select "JsonToView"('data_import.import_360xero_report'); 我的代码在下面 create or replace function data_import."JsonToView"(tname text) returns numeric language

我是wrt函数的新手,正在努力在函数体中使用表的名称。当我使用调用函数时,得到一个错误“SQL错误[42703]:错误:列“tname”不存在”

select "JsonToView"('data_import.import_360xero_report'); 
我的代码在下面

create or replace
function data_import."JsonToView"(tname text) returns numeric
language plpgsql 
as $function$ 
begin 
    do 
    $$
declare
    l_keys text;

begin 
    
drop view if exists v_json_view cascade;

select
    string_agg(distinct format('import_data ->> %L as %I', jkey, jkey), ', ')
into
    l_keys
from
    import_360xero_report,
    json_object_keys(import_data) as t(jkey);

execute 'create view v_json_view as select ' || l_keys || ' from ' || tname;
end;

$$; 
return 0;
end $function$ ;

我修改了代码,第二个CREATEVIEW查询使用表名,但第一个不使用

下面是我修改过的代码

create or replace
function data_import."JsonToView"(tname text) returns numeric
language plpgsql 
as $function$ 

declare
    l_keys text;

begin 
    
drop view if exists v_json_view cascade;

execute $a$select
    string_agg(distinct format('import_data ->> %L as %I', jkey, jkey), ', ')
into
    l_keys
from $a$ ||
    tname || $b$,
    json_object_keys(import_data) as t(jkey)$b$;

execute 'create view v_json_view as select ' || l_keys || ' from ' || tname;


return 0;
end $function$ ;
我得到的错误是

SQL Error [0A000]: ERROR: EXECUTE of SELECT ... INTO is not implemented
  Hint: You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead.
  Where: PL/pgSQL function "JsonToView"(text) line 10 at EXECUTE

问题在于多余的嵌套
DO
语句

变量
tname
仅存在于函数的作用域中,而不存在于嵌套的
DO
语句中
DO
是一条SQL语句,不是PL/pgSQL语句,并且SQL中没有变量。另外,
DO
不允许使用参数


摆脱
DO
,你就会好起来。

难以置信。错误报告在哪一行?这
开始执行
应该执行什么操作?我会丢失它和内部嵌套
$$
引号。@LaurenzAlbe错误在第17行。确切的错误消息是“SQL错误[42703]:错误:列“tname”不存在,其中:PL/pgSQL函数内联\u代码\u块第17行在执行…”@Adriankeraver我正在仔细检查,但我认为您的建议现在似乎起作用了这很好。我已经修改了代码。我遇到的第二个问题(如果我需要为它创建一个单独的线程,请告诉我)是,带有第一个select语句的execute查询现在导致了一个错误。我不认为这是问题所在,因为我没有得到“找不到”列错误,而是得到了一个
SQL错误[0A000]:错误:execute of select。。。INTO未实现提示:您可能希望使用EXECUTE。。。进入或执行创建表。。。相反,我认为是这样的。其中:PL/pgSQL函数“JsonToView”(文本)第10行执行
Yes,它不应该是
EXECUTE$$SELECT x INTO var FROM…$$,但
执行$$SELECT x FROM…$$INTO var