我正在尝试编写一个函数,直到将某个东西插入到我的表中。我希望它能够检查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 –