我有應該創建丟失物件的功能。我有一個用于設定活動模式 tschem_name 的變數
但是,如果 proc 嘗試創建此物件,則感覺它看不到此變數,但是,如果哪個檢查物件是否存在可以看到此變數,則感覺就像將其視為表中的一列。知道如何解決它嗎?我試圖在 else 陳述句中使用宣告,但它不起作用:(
錯誤:列“tschem_name”不存在
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$;
uj5u.com熱心網友回復:
問題是你的CREATE VIEW陳述。EXECUTE為此,您需要使用動態 SQL 。
根本原因是CREATE VIEW不接受引數。
順便說一下,您的代碼容易受到 SQL 注入的影響。切勿通過將字串與||. format與%I占位符一起使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328564.html
標籤:PostgreSQL plpgsql 动态-sql postgresql-9.6
上一篇:對PostgreSQL性能的理解
