postgres 函数看不到变量
postgres function cannot see variable
我有一个函数可以创建丢失的对象。我有一个用于设置活动模式的变量 tschem_name
然而,如果 proc 试图创建这个对象,感觉它看不到这个变量,但是,如果 which 检查对象是否存在可以看到这个变量,感觉就像它把它当作 table 中的一个列。知道如何解决吗?我试图在 else 语句中使用 declare 但它不起作用:(
ERROR: column "tschem_name" does not exist
CREATE OR REPLACE FUNCTION public.fn_upd_schema(
tschem_name character varying
)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
--tname text := t_shema;
--tschem_name text := tname||'_assets';
tsql_dyn text ;
nschema_check numeric := 0 ;
BEGIN
SELECT 1
INTO nschema_check
FROM PG_NAMESPACE
WHERE NSPNAME = tschem_name;
IF nschema_check = 0 THEN
RETURN 'Schema '||tschem_name ||' Does Not Exist';
ELSE
tsql_dyn := 'SET search_path TO '||tschem_name ||';';
raise notice 'EXECUTE %', tsql_dyn;
EXECUTE tsql_dyn;
IF EXISTS (SELECT FROM information_schema.tables
WHERE table_schema = tschem_name
AND table_type = 'VIEW'
AND table_name = 'vw_aaa')
THEN
null;-- raise notice 'vw_aaa EXISTS';
ELSE
--declare tschemaname text := tschem_name;
CREATE VIEW vw_aaa AS
SELECT
tschem_name::text AS database,
tale1.column1,
tale1.column2
From table1;
endif;
RETURN tschem_name ||' UPDATED TO STANDART';
END IF;
END;
$BODY$;
问题出在您的 CREATE VIEW
语句上。为此,您需要使用带有 EXECUTE
的动态 SQL。
根本原因是CREATE VIEW
不接受参数。
顺便说一下,您的代码容易受到 SQL 注入攻击。切勿通过将字符串与 ||
连接来构造 SQL 语句。使用 format
和 %I
占位符。
我有一个函数可以创建丢失的对象。我有一个用于设置活动模式的变量 tschem_name
然而,如果 proc 试图创建这个对象,感觉它看不到这个变量,但是,如果 which 检查对象是否存在可以看到这个变量,感觉就像它把它当作 table 中的一个列。知道如何解决吗?我试图在 else 语句中使用 declare 但它不起作用:(
ERROR: column "tschem_name" does not exist
CREATE OR REPLACE FUNCTION public.fn_upd_schema(
tschem_name character varying
)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
--tname text := t_shema;
--tschem_name text := tname||'_assets';
tsql_dyn text ;
nschema_check numeric := 0 ;
BEGIN
SELECT 1
INTO nschema_check
FROM PG_NAMESPACE
WHERE NSPNAME = tschem_name;
IF nschema_check = 0 THEN
RETURN 'Schema '||tschem_name ||' Does Not Exist';
ELSE
tsql_dyn := 'SET search_path TO '||tschem_name ||';';
raise notice 'EXECUTE %', tsql_dyn;
EXECUTE tsql_dyn;
IF EXISTS (SELECT FROM information_schema.tables
WHERE table_schema = tschem_name
AND table_type = 'VIEW'
AND table_name = 'vw_aaa')
THEN
null;-- raise notice 'vw_aaa EXISTS';
ELSE
--declare tschemaname text := tschem_name;
CREATE VIEW vw_aaa AS
SELECT
tschem_name::text AS database,
tale1.column1,
tale1.column2
From table1;
endif;
RETURN tschem_name ||' UPDATED TO STANDART';
END IF;
END;
$BODY$;
问题出在您的 CREATE VIEW
语句上。为此,您需要使用带有 EXECUTE
的动态 SQL。
根本原因是CREATE VIEW
不接受参数。
顺便说一下,您的代码容易受到 SQL 注入攻击。切勿通过将字符串与 ||
连接来构造 SQL 语句。使用 format
和 %I
占位符。