2015-10-07 70 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; 
/

我希望這有助於!