2015-10-07 2 views
0

Я пытаюсь написать функцию, которая будет работать до тех пор, пока в мою таблицу не будет вставлено что-либо. Я хочу, чтобы он каждые 10 секунд проверял запись, дающую мне выходное сообщение.SQL/Function Loops

Я знаю, что мне придется использовать dbms_lock.sleep (10) и цикл while.

, но любые другие советы были бы очень полезными.

+4

Постоянный опрос базы данных звучит как полный перебор. Для этого используйте триггер до/после. –

+0

Вы можете использовать СУБД Schedular. Как только функция запланирована на каждые 10 минут. Если какой-либо вывод RETURN выполняется с помощью функции, вы можете продолжить процесс. –

+1

Я согласен с Фрэнком. Вы можете комбинировать триггеры с системой уведомлений Oracle: http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_cqn.htm#ADFNS018 или http://docs.oracle.com/cd/E11882_01/appdev 0,112/e41502/adfns_publish.htm # ADFNS827 –

ответ

-1

Я полностью согласен с Фрэнком Шмиттом, у SGBD есть триггеры, подобные событиям на обычном языке программирования, есть триггер для многих операций над (базами данных, таблицами, строками, столбцами и т. Д.) Элементами база данных.

0

Есть несколько способов, чтобы ответить на ваш вопрос:

ПРЕДОСТЕРЕЖЕНИЯ:

я предположил, что базовые знания PL/SQL.

не имеют IDE передо мной сегодня, и я не ВПО никакого знания вашей схемы и т.д., так что код будет лучшее усилие, и вы будете нуждаться в заменить ваши таблицы песка столбцы и т.д. в него ,

Я предполагаю, что используя DBMS_OUTPUT будет достаточно, чтобы быть достаточно для вашего «исходящего сообщения»

1) Как вы просили, петлю и опрос каждые 10 секунд Это довольно неприятным способ идентификации, когда запись была введена в вашу БД.

CREATE OR REPLACE 
FUNCTION check_for_record 
AS 
    -- Declare the cursor that checks for your record 
    CURSOR db_rec_cur 
    IS 
     SELECT 1 
     FROM <table_name> 
     WHERE <criteria>; 

    -- Variable to hold cursor output 
    v_db_rec db_rec_cur%ROWTYPE; 
BEGIN 
    -- Enable DBMS_OUTPUT 
    DBMS_OUTPUT.ENABLE(1000000); 

    -- Start the polling loop 
    LOOP 
     -- Output a message when testing for the record 
     DBMS_OUTPUT.put_line(TO_CHAR(sysdate, 'YYYYMMDDHH24MISS')||': Checking for DB record'); 

     -- Test if the record is in the DB 
     OPEN db_rec_cur; 
     FETCH db_rec_cur INTO v_db_rec; 
     CLOSE db_rec_cur; 

     -- Exit the polling loop when a record has been found 
     EXIT WHEN v_db_rec IS NOT NULL; 

     -- IF the loop has not exited, sleep foir 10 seconds 
     DBMS_LOCK.sleep(10); 

    -- End the loop 
    END LOOP; 
EXCEPTION 
    WHEN others 
    THEN 
     -- Check the cursor is closed 
     IF db_rec_cur%ISOPEN 
     THEN 
     CLOSE db_rec_cur; 
     END IF; 

     -- Output the error 
     DBMS_OUTPUT.put_line(SQLERRM); 

     -- Propagate the error 
     RAISE; 
END check_for_record; 
/

2) Используйте триггер базы данных, чтобы уведомить вас, когда запись была вставлена ​​

Если вы ищете конкретные значения, которые были вставлены затем:

CREATE OR REPLACE 
TRIGGER recordinsert_trg 
AFTER INSERT ON <table_name> 
FOR EACH ROW 
DECLARE 
BEGIN 
    -- Enable DBMS_OUTPUT 
    DBMS_OUTPUT.ENABLE(1000000); 

    -- Check the ":new" values inserted to see if they match your criteria 
    IF :new.<your_column> = <your_specific_value> 
    THEN 
     -- Output a message when testing for the record 
     DBMS_OUTPUT.put_line(TO_CHAR(sysdate, 'YYYYMMDDHH24MISS')||': Your value was inserted!'); 
    END IF; 
EXCEPTION 
    WHEN others 
    THEN 
     -- Output the error 
     DBMS_OUTPUT.put_line(SQLERRM); 

     -- Propagate the error 
     RAISE; 
END recordinsert_trg; 
/

Если вы просто хотят узнать, когда что-то или что-то было вставлено в ваш стол, тогда:

CREATE OR REPLACE 
TRIGGER recordinsert_trg 
AFTER INSERT ON <table_name> 
DECLARE 
BEGIN 
    -- Enable DBMS_OUTPUT 
    DBMS_OUTPUT.ENABLE(1000000); 

    -- Output a message when the record was inserted 
    DBMS_OUTPUT.put_line(TO_CHAR(sysdate, 'YYYYMMDDHH24MISS')||': A record was inserted!'); 
EXCEPTION 
    WHEN others 
    THEN 
     -- Output the error 
     DBMS_OUTPUT.put_line(SQLERRM); 

     -- Propagate the error 
     RAISE; 
END recordinsert_trg; 
/

Надеюсь, это поможет!