今天是第一次使用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之后要在里面添加上存储过程的具体实现;