有没有人知道是否可以将COUNT值声明为在查询/函数/触发器中调用的变量?
我想使用COUNT值来触发从table1到table2的数据传输,当table1的行数达到500时触发。
FIX .....
定义计数功能:
CREATE OR REPLACE FUNCTION count_function () RETURNS integer AS $$
BEGIN
RETURN (SELECT COUNT(*) FROM table1);
END $$ LANGUAGE plpgsql;
调用变量来触发事件:
CREATE OR REPLACE FUNCTION save_table2()
RETURNS trigger AS
$$
BEGIN
IF count_function()>=500 THEN
INSERT INTO table2
values ('NEW.column1','NEW.column2');
END IF;
RETURN NEW;
END $$
LANGUAGE plpgsql;
CREATE TRIGGER copy_trigger
AFTER INSERT ON table1
FOR EACH ROW
EXECUTE PROCEDURE save_table2();
答案 0 :(得分:1)
您是否尝试过这种方法(应该适用于MySQL和SQL Server,也许也适用于PostgreSQL)?
SELECT count_function();
在Oracle上它将是
SELECT count_function() FROM DUAL;
要将结果存储在变量中,您可以执行以下操作:
DECLARE result int;
SET result = SELECT count_function();
在您的情况下,触发器可以写为:
CREATE TRIGGER copy_trigger
AFTER INSERT ON table1
FOR EACH STATEMENT
WHEN count_function() >= 500
EXECUTE PROCEDURE save_table2 ();
请注意>=
表示更大或相等。虽然=>
不存在(或者不是它的样子)。
如果没有别的帮助,你可以这样做:
CREATE OR REPLACE FUNCTION save_table2_on_500()
RETURNS VOID AS $$
DECLARE cnt INTEGER;
BEGIN
cnt := (SELECT COUNT(*) FROM table1);
IF cnt >= 500 THEN
EXECUTE PROCEDURE save_table2();
END IF;
END $$ LANGUAGE plpgsql;
CREATE TRIGGER copy_trigger_on_500
AFTER INSERT ON table1
FOR EACH STATEMENT
EXECUTE PROCEDURE save_table2_on_500();
编辑:代码
出了什么问题我使用了关键字PROCEDURE
,因为它在各种数据库系统(SQL Server,Oracle,MySQL)中非常常见。但它在PostgreSQL上并不合法。
在PostgreSQL上,您必须使用FUNCTION
并指定返回类型VOID
,我认为这有点矛盾,但我在这里详细讨论了详细信息。
function vs procedure is here的完整解释。
区别主要是函数返回标量值,而过程可能不返回任何内容(VOID
),标量值或数据表。它更灵活,但也有其他警告。有关详细信息,请参阅上面的链接。
答案 1 :(得分:0)
你应该从函数中调用函数而不是变量:
SELECT count_function ()
同样在函数中你不需要变量并具有:
RETURN (SELECT COUNT(*) FROM table1);