最近在進行Oracle DB 的PROCEDURE撰寫,來記錄一下
首先最簡單的PROCEDURE,使用下列語法,最好是能夠在最後增加EXCEPTION與DBMS_OUTPUT.put_line (SQLERRM)這兩段,才知道是哪裡寫錯了,或者是有甚麼TableSpace不足的問題發生
CREATE OR REPLACE PROCEDURE p_name (parameter1 boolean)
ASindex_st DATE ;
index_et DATE ;BEGIN
--TODO
index_st := TO_DATE('2017/01/01 00:00','yyyy/mm/dd hh24:mi');
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
ROLLBACK;END;
另外紀錄CURSOR撰寫方式,建構在PROCEDURE之下
CREATE OR REPLACE PROCEDURE p2_name(arttransfrom boolean)
AS
CURSOR c1 (b VARCHAR2, c VARCHAR2)
IS
SELECT * from a
WHERE a.type = b and a.cc = c;
v1 c1%ROWTYPE;
BEGIN
OPEN c1 ('1','2');
LOOP
FETCH c1 INTO v1;
EXIT WHEN c1%NOTFOUND;
INSERT INTO a( id , type)
VALUES (v1.id , v1.type);
END LOOP;
COMMIT;
CLOSE c1;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
ROLLBACK;
END;
講解 :
在AS底下定義CURSOR,CURSOR可以進行參數餵入,但無法使用execute immediate進行SQL語句組合,
所以本範例把餵入的參數當作條件使用,如需進行在CURSOR中進行語句組合,應該是有辦法的,須詢問GOOGLE大神,引入外部函示庫進行
記得要先宣告v1這個承接器,並把它的型態設為c1的型態
在來是在使用CURSOR時,必須先進行OPEN,並法參數放數,如沒有則不需放入,在CURSOR中,他會把每一列的資料進行抓取出來使用,所以一定要使用LOOP迴圈進行
FETCH c1 INTO v1;的意思是把CURSOR抓到的東西放入v1中,以利後續使用
EXIT WHEN c1%NOTFOUND; 是如果CURSOR抓不到東西就進行跳出回圈,類似while
使用完CURSOR記得進行關閉,以減少記憶體量的使用!