将COUNT值声明为变量(PostgreSQL)

时间:2016-10-11 12:37:14

标签: postgresql variables count plpgsql

有没有人知道是否可以将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();

2 个答案:

答案 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);