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 占位符。