2016年2月19日 星期五

包三(DBMS_JOB、DBMS_ASSERT) (PL/SQL 十七)

※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看不到自己的

沒有留言:

張貼留言