2016-10-11 81 views
1

有誰知道是否可以聲明COUNT值作爲變量來調用查詢/函數/觸發器?將COUNT值聲明爲變量(PostgreSQL)

我想用計數值從表1觸發數據轉移到表2,觸發時,表1的行數達到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(); 
+1

你的函數返回一個整數,而不是一個表。目前還不清楚你想要做什麼,但一個標量函數將被稱爲'select count_function()'。 –

+0

除了別的,你需要添加「RETURN Cnt;」在END聲明之前... – mlinth

+0

我想定義計數值作爲一個變量(整數)。我想用這個值來觸發一個事件 - 當count = 500時。所以我想要返回一個整數值。 –

回答

1

你有沒有試過(應該可以在MySQL和SQL Server上工作,也許PostgreSQL也是)?

​​

在甲骨文這將是

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),標量值或數據表。它更靈活,但也有其他警告。有關更多詳細信息,請參閱上面的鏈接。

+0

啊是的,這工作,雖然我可以調用一個函數作爲觸發器中的變量? –

+0

是的,您可以從另一個函數調用函數並將結果存儲在變量中。 – pid

+0

我唯一要補充的是,我個人會將值500存儲在一個表中,所以您可以輕鬆更改它,而無需編輯該函數。 – mlinth

0

你應該叫不是函數變量從功能: SELECT count_function() 另外,在功能,您不需要的變量,有這樣的: RETURN (SELECT COUNT(*) FROM table1);

+0

謝謝sebz :) –

+0

不客氣!希望它也適合你。 – Sebz

+0

是的,謝謝!我現在只是堅持如何使用此函數值來觸發事件 –