2016-10-11 4 views
1

Кто-нибудь знает, можно ли объявить значение COUNT в качестве переменной для вызова в запросах/функциях/триггерах?Объявить значение COUNT как переменную (PostgreSQL)

Я хотел бы использовать значение 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(); 
+1

Вашей функция возвращает целое число, а не таблицы. Непонятно, что именно вы хотите сделать, но скалярная функция будет вызываться как 'select count_function()'. –

+0

Помимо всего прочего, вам нужно добавить «RETURN Cnt;» перед заявлением END ... – mlinth

+0

Я хотел бы определить значение count как переменную (целое число). Я хочу использовать это значение для запуска события - когда count = 500. Поэтому я хочу вернуть целочисленное значение. –

ответ

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(); 

EDIT: Что не так с кодом

Я использовал ключевое слово 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

Да, спасибо! Я теперь просто зациклился на том, как использовать это значение функции для запуска события –