close

最近在進行Oracle DB 的PROCEDURE撰寫,來記錄一下

首先最簡單的PROCEDURE,使用下列語法,最好是能夠在最後增加EXCEPTION與DBMS_OUTPUT.put_line (SQLERRM)這兩段,才知道是哪裡寫錯了,或者是有甚麼TableSpace不足的問題發生

 

CREATE OR REPLACE PROCEDURE p_name (parameter1 boolean)
AS

   index_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記得進行關閉,以減少記憶體量的使用!

arrow
arrow
    文章標籤
    Oracle procedure
    全站熱搜

    cs60811 發表在 痞客邦 留言(0) 人氣()