我正在嘗試編寫一個函數,直到將某個東西插入到我的表中。我希望它能夠檢查10秒鐘的輸入信息。我知道我將不得不使用dbms_lock.sleep(10)和一個while循環。SQL /函數循環
但任何其他建議將是非常有益的。
我正在嘗試編寫一個函數,直到將某個東西插入到我的表中。我希望它能夠檢查10秒鐘的輸入信息。我知道我將不得不使用dbms_lock.sleep(10)和一個while循環。SQL /函數循環
但任何其他建議將是非常有益的。
我完全同意弗蘭克施密特,SGBD有觸發器像在正常的編程語言中的事件,有許多操作的觸發器(數據庫,表,行,列等)元素的數據庫。
有幾種方法來回答你的問題:
注意事項:
我假設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;
/
我希望這有助於!
永久輪詢數據庫聽起來像是完全矯枉過正。爲此,請使用前/後插入觸發器。 –
您可以使用DBMS Schedular。一旦功能計劃每10分鐘運行一次。如果任何輸出是由函數返回的,您可以繼續處理。 –
我同意弗蘭克。您可以將觸發器與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 –