我想为 PG SQL 数据库中的模式创建一个更新函数。测试功能如下。它不起作用,因为它永远不应该发出通知,但会在运行时发出通知test_schema_update('second')
。
CREATE OR REPLACE FUNCTION test_schema_update(my_schema_name VARCHAR(200))
RETURNS void AS
$__marker__$
DECLARE
actualValue varchar(1000);
testValue varchar(1000);
BEGIN
EXECUTE 'SET search_path TO ' || quote_ident(my_schema_name);
testValue := (SELECT max(value) FROM setting WHERE settingkey = 'libraryname');
EXECUTE ('SELECT max(value) FROM setting WHERE settingkey = ''libraryname''')
INTO actualValue;
IF (actualValue != testValue)
THEN
RAISE NOTICE '% != %', actualValue, testValue;
RAISE INFO 'Schema was: %', current_schema();
END IF;
RESET search_path;
END;
$__marker__$ LANGUAGE plpgsql;
test_schema_update('first');
test_schema_update('second');
问题是 PG SQL 似乎SELECT
每个会话只分析一次语句,然后将表固定到特定模式。有趣的是你会得到Schema was: second
.
那么有没有办法重置SELECT
语句分析或其他方法来解决这个问题?
旁注:所有模式创建功能(ALTER TABLE
,CREATE TABLE
...)都可以正常工作。似乎只有数据操作函数受到影响(SELECT
, INSERT
, UPDATE
)。
解决方法
前:
IF (
SELECT max(id) FROM dimtime
)
THEN
INSERT INTO dimtime SELECT * FROM public.src_dimtime;
END IF;
后:
EXECUTE ('
SELECT max(id) FROM dimtime
')
INTO testInt;
IF (testInt IS NULL)
THEN
EXECUTE 'INSERT INTO dimtime SELECT * FROM public.src_dimtime';
END IF;
编辑:问题出现在 PostgreSQL 9.2 中,但似乎没有出现在 9.3 中。也许它是固定的?