關於使用plsqldevelope創建存儲過程的詳細步驟!!!

今天是第一次使用plsqlDevelope操作oracle,很多操作都是陌生的,特別是對於使用該工具對存儲過程來進行創建;

什麼是存儲過程?

簡而言之,存儲過程也就是爲了以後可以使用的一行或者是多行的sql語句集合;

存儲過程的優點

1、把處理封裝在容易使用的單元中,簡化複雜的操作
2、保證了數據的完整性
3、提高性能

如何使用plsqldevelope創建存儲過程?

方式一:我們可以在選擇my objects之後直接右擊procedure進行創建,如下圖所示
在這裏插入圖片描述
在進去時就創建好該過程名以及是否需要添加的參數;
在這裏插入圖片描述
方式二:我們也可以找到packages,直接右擊package來先創建好包,在裏面定義聲明好函數、遊標、過程,再到右側的package bodies詳細寫每個過程的具體實現;
在這裏插入圖片描述
在這裏插入圖片描述

create or replace package ZJM_TEST is

  -- Author  : ZJM
  -- Created : 2020/3/9 16:11:21
  -- Purpose : 這是我們測試用包
--這裏聲明一個遊標
TYPE T_CURSOR IS REF CURSOR;
--這裏再加一個函數
 FUNCTION GET_PARENT_NAME(QPARENT_ID VARCHAR2) RETURN VARCHAR2;
--依次添加園區管理的存儲過程
  PROCEDURE SHOW_ALL_YQ(USER_ID       VARCHAR2,
                        QSEARCH_REGION   VARCHAR2,
                        PAGENO        INT,
                        PAGERECORDNUM INT,
                        TOTALCOUNT    OUT LONG,
                        LIST          OUT T_CURSOR);
                        
  
  PROCEDURE SHOW_ONE_YQ(QREGION_ID VARCHAR2,
                        QREGION_NAME OUT VARCHAR2,
                        QINTRODUCE OUT VARCHAR2,
                        QVR_URL OUT VARCHAR2,
                        QPARENT_ID OUT VARCHAR2,
                        QORDER OUT VARCHAR2,
                        QID OUT VARCHAR2,
                        QP_NAME OUT VARCHAR2
                        );

  PROCEDURE ADD_MODIFY_YQ(
                   QREGION_ID   VARCHAR2,
                   QREGION_NAME VARCHAR2,
                   QINTRODUCE   VARCHAR2,
                   QVR_URL      VARCHAR2,
                   QPARENT_ID   VARCHAR2,
                   QORDER       NUMBER,
                   URLS VARCHAR2,
                   SUCCESS      OUT VARCHAR2);
  PROCEDURE DELETE_YQ(QREGION_ID VARCHAR2, SUCCESS OUT VARCHAR2);

end ZJM_TEST;

下面是bodies中的具體實現:

create or replace package body ZJM_TEST is
--這裏我們在程序包體中對函數進行說明定義
FUNCTION GET_PARENT_NAME(QPARENT_ID VARCHAR2) RETURN VARCHAR2
 IS
 RES VARCHAR(32);
 BEGIN
   SELECT MAX(T.REGION_NAME) INTO RES  FROM MY_BASE_INFO T WHERE T.ID = QPARENT_ID;
   RETURN RES;
 END;

     PROCEDURE SHOW_ALL_YQ(
                        USER_ID       VARCHAR2,
                        QSEARCH_REGION   VARCHAR2,
                        PAGENO        INT,
                        PAGERECORDNUM INT,
                        TOTALCOUNT    OUT LONG,
                        LIST          OUT T_CURSOR
                   )IS
    BEGIN

      SELECT
      COUNT(*) INTO TOTALCOUNT
      FROM MY_BASE_INFO T WHERE T.IS_LEVEL='003' AND T.STATE ='00A'
      AND T.REGION_NAME LIKE '%'||QSEARCH_REGION||'%';

      OPEN LIST FOR
      SELECT A.*,
      GET_PARENT_NAME(A.PARENT_ID) P_NAME
      FROM (
      SELECT
      T.ID,
      T.REGION_NAME,
      T.PARENT_ID,
      SHOW_ORDER,
      ROW_NUMBER() OVER (ORDER BY T.SHOW_ORDER DESC) ROWNUMINDEX
      FROM MY_BASE_INFO T WHERE T.IS_LEVEL='003' AND T.STATE ='00A'
      AND T.REGION_NAME LIKE '%'||QSEARCH_REGION||'%'
      ) A
      WHERE ROWNUMINDEX <= PAGERECORDNUM * PAGENO
      AND ROWNUMINDEX > PAGERECORDNUM * (PAGENO - 1);


    END ;

      PROCEDURE SHOW_ONE_YQ(QREGION_ID VARCHAR2,
                        QREGION_NAME OUT VARCHAR2,
                        QINTRODUCE OUT VARCHAR2,
                        QVR_URL OUT VARCHAR2,
                        QPARENT_ID OUT VARCHAR2,
                        QORDER OUT VARCHAR2,
                        QID OUT VARCHAR2,
                        QP_NAME OUT VARCHAR2
                        )IS
                        TMP NUMBER;
       BEGIN
          SELECT COUNT(*) INTO TMP FROM MY_BASE_INFO T
          WHERE T.ID = QREGION_ID AND T.STATE = '00A' ;
         IF TMP > 0 THEN
         SELECT
         T.ID,
         T.REGION_NAME ,
         T.INTRODUCE ,
         T.VR_URL,
         T.PARENT_ID ,
         T.SHOW_ORDER,
         GET_PARENT_NAME(T.PARENT_ID) P_NAME
         INTO
         QID,
          QREGION_NAME ,
          QINTRODUCE ,
          QVR_URL ,
          QPARENT_ID ,
          QORDER,
          QP_NAME
         FROM MY_BASE_INFO T WHERE T.ID = QREGION_ID;
         ELSE
         SELECT
         '1',
         '1',
         '1',
         '1',
         '1'
         INTO
          QREGION_NAME ,
          QINTRODUCE ,
          QVR_URL ,
          QPARENT_ID ,
          QORDER
         FROM MY_BASE_INFO T WHERE T.ID = QREGION_ID ;

         END IF;

       END;




    PROCEDURE ADD_MODIFY_YQ(
                   QREGION_ID   VARCHAR2,
                   QREGION_NAME VARCHAR2,
                   QINTRODUCE   VARCHAR2,
                   QVR_URL      VARCHAR2,
                   QPARENT_ID   VARCHAR2,
                   QORDER       NUMBER,
                   URLS VARCHAR2,
                   SUCCESS      OUT VARCHAR2
                   )IS
                   TMP NUMBER;
                   UUID VARCHAR2(32);
      BEGIN
      select count(*) into tmp from my_base_info t where t.id =QPARENT_ID
       and t.state ='00A' and t.is_level ='002';
       --上級區域是否選對
      if tmp > 0 then

      
       if URLS ='' or URLS=null then

       SUCCESS:='ERROR';
       else
       
       select count(*) into tmp from  my_base_info t where t.id =QREGION_ID and t.state ='00A';
       
       --大於0爲修改
       if tmp > 0 then
         update MY_BASE_INFO t set
        region_name =  QREGION_NAME,
        introduce =QINTRODUCE  ,
        vr_url   =QVR_URL  ,
        show_order =QORDER ,
         t.parent_id =  QPARENT_ID
         where t.id = QREGION_ID ;
       delete from pub_attachment t where t.up_info_id = QREGION_ID ; 
             
       INSERT INTO pub_attachment
        select
        fn_getuuid,
        QREGION_ID,
        A.col,
        '1',
        '陵園圖片',
        to_char(sysdate,'YYYYMMDDhh24miss'),
        A.col,
        A.col,
        to_char(sysdate,'yyyy'),
        to_char(sysdate,'MM')
        from (
        select column_value as col from table(STR2VARLIST(URLS))) A ;
        SUCCESS:='OK';
       else
          UUID:=fn_getuuid;
        INSERT INTO MY_BASE_INFO
        (
        id          ,
        region_name ,
        is_level    ,
        introduce   ,
        vr_url     ,
        parent_id   ,
        state       ,
        show_order  ,
        ORDER_INDEX,
        FSW_TYPE
        )
        VALUES
        (
        fn_getuuid,
        '全部',
        '004',
        '全部',
        '',
        UUID,
        '00A',
        1,
        4,
        '001'
        );
        
        
         INSERT INTO MY_BASE_INFO
        (
        id          ,
        region_name ,
        is_level    ,
        introduce   ,
        vr_url     ,
        parent_id   ,
        state       ,
        show_order  ,
        ORDER_INDEX
        )
        VALUES
        (
        UUID,
        QREGION_NAME,
        '003',
        QINTRODUCE,
        QVR_URL,
        QPARENT_ID,
        '00A',
        QORDER,
        3
        );
         INSERT INTO pub_attachment
        select
        fn_getuuid,
        UUID,
        A.col,
        '1',
        '園區圖片',
        to_char(sysdate,'YYYYMMDDhh24miss'),
        A.col,
        A.col,
        to_char(sysdate,'yyyy'),
        to_char(sysdate,'MM')
        from (
        select column_value as col from table(STR2VARLIST(URLS))) A ;

        SUCCESS:='OK';
        END IF;
       end if;

        else
           SUCCESS:='REGION_ERROR';
        end if;

      END;
    PROCEDURE DELETE_YQ(
                   QREGION_ID VARCHAR2,
                   SUCCESS OUT VARCHAR2
                   )IS
         TMP NUMBER;
     BEGIN
     select count(*) into TMP from  my_mw_info t where
     t.yq_id = QREGION_ID and   t.id in 
    (select a.good_id  from MY_ORDER_DETAIL a ) and t.mw_status = '00A';
     
    if  TMP > 0 then
     SUCCESS:='ORDER_ERROR';
    else
   
      update my_base_info t set T.STATE ='00X' WHERE T.ID IN (
     SELECT ID FROM MY_BASE_INFO B START WITH B.ID = QREGION_ID CONNECT BY PRIOR ID = PARENT_ID
     );
     SUCCESS:='OK';
    end if;
     END;
end ZJM_TEST;

最後,摁f8就能直接對該過程進行編譯;

注意:packages 和package bodies區別:

我們理解爲package是java中的定義的接口,我們可以把過程定義在裏面,而package bodies是接口的實現類,我們實現該packages之後要在裏面添加上存儲過程的具體實現;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章