2015-10-07 101 views
0

我正在尝试编写一个函数,直到将某个东西插入到我的表中。我希望它能够检查10秒钟的输入信息。我知道我将不得不使用dbms_lock.sleep(10)和一个while循环。SQL /函数循环

但任何其他建议将是非常有益的。

+4

永久轮询数据库听起来像是完全矫枉过正。为此,请使用前/后插入触发器。 –

+0

您可以使用DBMS Schedular。一旦功能计划每10分钟运行一次。如果任何输出是由函数返回的,您可以继续处理。 –

+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和我的hve没有 知识您的模式等,使代码将是一个最好的努力,你将需要 你的表列沙等代入它。

我假设使用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; 
/

我希望这有助于!