我必须调用程序来按名称分析表。 例如:
call schema_name.analyze('table_name')
。
我已经创建了程序,但出现错误
错误:关系“x”不存在。
如何处理?
CREATE OR REPLACE PROCEDURE schema_name.analyze(IN x VARCHAR)
LANGUAGE plpgsql
AS $$
begin
analyze x;
END;
$$;
什么对我有用:
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql
AS $procedure$
begin
EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$
由于您正在进行动态命名,请使用
EXECUTE
。然后 quote_ident()
正确引用传入的名称。
更新
为什么
quote_ident()
很重要的示例:
create table "MixedCase" (id int);
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql
AS $procedure$
begin
EXECUTE 'analyze ' || x;
END;
$procedure$
call analyze_test('MixedCase');
ERROR: relation "mixedcase" does not exist
CONTEXT: SQL statement "analyze MixedCase"
PL/pgSQL function analyze_test(character varying) line 3 at EXECUTE
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql
AS $procedure$
begin
EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$
call analyze_test('MixedCase');
CALL
更新2
要让过程或函数以创建它的用户的权限运行,请使用
SECURITY DEFINER
。请参阅本页底部部分:
https://www.postgresql.org/docs/current/sql-createfunction.html
安全地编写 SECURITY DEFINER 函数
关于该做和不该做的事情。
这是带有
SECURITY DEFINER
的原始函数:
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql SECURITY DEFINER
AS $procedure$
begin
EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$