今天是第一次使用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之後要在裏面添加上存儲過程的具體實現;