关于使用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之后要在里面添加上存储过程的具体实现;

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