Postgresql Postgres-在函数体中使用表名(传入参数)
我是wrt函数的新手,正在努力在函数体中使用表的名称。当我使用调用函数时,得到一个错误“SQL错误[42703]:错误:列“tname”不存在”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
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代码>。