※DBMS_JOB
官方手冊在這其實就是排程,看要自動做什麼事情的功能
※我試過每一秒就執行一次,使用DBMS_OUT.PUT_LINE但看不出效果,所以就用個測試表來練習,才看得出來
DROP TABLE dbms_job_test_table PURGE; DROP SEQUENCE dbms_job_test; CREATE TABLE dbms_job_test_table( jid NUMBER, jname VARCHAR2(20), jdate DATE, CONSTRAINT jid_pk PRIMARY KEY(jid) ); CREATE SEQUENCE dbms_job_test;
※使用procedure做一個新增的功能
CREATE OR REPLACE PROCEDURE save_dbms_job_test_table_proc(p_name dbms_job_test_table.jname%TYPE) IS BEGIN INSERT INTO dbms_job_test_table VALUES (dbms_job_test.NEXTVAL, p_name, SYSDATE); END;
※使用排程,參數的用途請看官網的解釋
DECLARE num NUMBER; BEGIN DBMS_JOB.SUBMIT( num, 'save_dbms_job_test_table_proc(''xxx'');', SYSDATE, 'SYSDATE + (1/(60*60*24))' ); DBMS_OUTPUT.PUT_LINE('num=' || num); COMMIT; END;
※結果:num=24
※要注意第二個參數後面有個「;」,而結果的24視個人情況而定
※使用「SELECT * FROM dbms_job_test_table;」過個幾秒執行一次就會看出效果
※這裡也看得到排程的程式
※刪除排程
DECLARE BEGIN DBMS_JOB.REMOVE(24); DBMS_OUTPUT.PUT_LINE('刪除job成功'); COMMIT; END;
※執行了以後就不會再新增了
※但有時候可能會忘記24這個數字,所以有一張表「user_jobs」,可以看到JOB這個欄位,如果還沒REMOVE可以看得到24這個數字,REMOVE完就沒了,也就證明刪除了
※DBMS_ASSERT
這個包可以將字串做一些驗證或轉換,可參考官網※ENQUOTE_LITERAL、ENQUOTE_NAME
SELECT DBMS_ASSERT.ENQUOTE_LITERAL('xxx') as A, DBMS_ASSERT.ENQUOTE_NAME('xxx') as B FROM DUAL;
※結果:
'xxx'
"XXX"
※ENQUOTE_LITERAL會在前後加上「'」
※ENQUOTE_NAME會將字串變成大寫,然後會在前後加上「"」
※SQL_OBJECT_NAME、QUALIFIED_SQL_NAME、SIMPLE_SQL_NAME
SELECT DBMS_ASSERT.SQL_OBJECT_NAME('xxx') as C, DBMS_ASSERT.QUALIFIED_SQL_NAME('xxx') as D, DBMS_ASSERT.SIMPLE_SQL_NAME('xxx') as E FROM DUAL;
※這三個方法如果都正確,都會回傳字串
※SQL_OBJECT_NAME是找有沒有符合的物件,例如叫xxx的function或procedure
※QUALIFIED_SQL_NAME、SIMPLE_SQL_NAME是指xxx是合法的SQL名稱嗎?所以如果輸入123xxx,因為是數字開頭,所以會錯,就不能用123xxx當變數,兩個我分不太清楚差在哪裡,只知道SIMPLE_SQL_NAME不檢查長度
※SCHEMA_NAME、NOOP
SELECT DBMS_ASSERT.SCHEMA_NAME('DIP') as F, DBMS_ASSERT.NOOP('xxx') as G FROM DUAL;
※NOOP輸入什麼就返回什麼,類似dos的echo
※SCHEMA_NAME裡的字串一定是大寫,驗證是不是有效的SCHEMA,也可用滑鼠看,但Oracle SQL Developer看不到自己的
沒有留言:
張貼留言