美文网首页
oracle 过程实例 函数 以及table的封装

oracle 过程实例 函数 以及table的封装

作者: vpike | 来源:发表于2019-01-26 17:12 被阅读0次

过程实例已备后期回顾

CREATE OR REPLACE PROCEDURE NRMS.P_UPDATE_FIBERPATH(IN_OSID NUMBER,IN_NSID NUMBER,IN_MOVESID NUMBER) IS

V_NUM NUMBER(5);
V_NEWSID NUMBER(14);
V_CITYCODE VARCHAR2(5);
V_GROUPID  NUMBER(14);

CURSOR CR_ATERMINAL IS SELECT * FROM S_FIBERPATH WHERE A_TERMINAL IN(
    SELECT CSID FROM R_CONTAIN WHERE C_CODE IN('TERMINAL','PORT') START WITH PSID=IN_MOVESID CONNECT BY PSID = PRIOR CSID
    UNION SELECT CSID FROM R_CONTAIN WHERE CSID=IN_MOVESID AND C_CODE IN('TERMINAL','PORT'));

CURSOR CR_ZTERMINAL IS SELECT * FROM S_FIBERPATH WHERE Z_TERMINAL IN(
    SELECT CSID FROM R_CONTAIN WHERE C_CODE IN('TERMINAL','PORT') START WITH PSID=IN_MOVESID CONNECT BY PSID = PRIOR CSID
    UNION SELECT CSID FROM R_CONTAIN WHERE CSID=IN_MOVESID AND C_CODE IN('TERMINAL','PORT'));

BEGIN
    SELECT F_GETTOP_EXCEPTSTATION(IN_NSID) INTO V_NEWSID FROM DUAL;
    SELECT CITY_CODE INTO V_CITYCODE FROM R_CONTAIN WHERE CSID=IN_MOVESID;
    V_NUM:=0;
    FOR C1 IN CR_ATERMINAL LOOP
         
        
        BEGIN 
            SELECT SID INTO V_GROUPID FROM S_FIBERPATH_GROUP WHERE A_SECTOP=V_NEWSID AND Z_SECTOP=C1.Z_SECTOP 
            OR  A_SECTOP=C1.Z_SECTOP AND Z_SECTOP=V_NEWSID;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                SELECT SEQ_FIBERPATH_GROUP.NEXTVAL INTO V_GROUPID FROM DUAL;
                INSERT INTO S_FIBERPATH_GROUP (SID,FIBERPATH_NUM,A_SECTOP,Z_SECTOP,CITY_CODE) 
                VALUES(V_GROUPID,0,V_NEWSID,C1.Z_SECTOP,V_CITYCODE);        
        END;

        --+1   
        UPDATE S_FIBERPATH_GROUP SET FIBERPATH_NUM=FIBERPATH_NUM+1 WHERE SID=V_GROUPID;

        --  -1
        SELECT FIBERPATH_NUM INTO V_NUM FROM S_FIBERPATH_GROUP WHERE SID=C1.GROUP_ID;
        
        IF V_NUM -1 <=0 THEN
            DELETE S_FIBERPATH_GROUP WHERE SID=C1.GROUP_ID;
        ELSE
            UPDATE S_FIBERPATH_GROUP SET FIBERPATH_NUM=FIBERPATH_NUM-1 WHERE SID=C1.GROUP_ID;
        END IF;
        
        --按 sid 改 fiberpath
        UPDATE S_FIBERPATH SET A_SECTOP=V_NEWSID,GROUP_ID=V_GROUPID WHERE SID=C1.SID;
    END LOOP;

    V_NUM:=0;
    FOR C2 IN CR_ZTERMINAL LOOP
        
        BEGIN
            SELECT SID INTO V_GROUPID FROM S_FIBERPATH_GROUP WHERE A_SECTOP=C2.A_SECTOP AND Z_SECTOP=V_NEWSID 
            OR A_SECTOP=V_NEWSID AND Z_SECTOP=C2.A_SECTOP;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                SELECT SEQ_FIBERPATH_GROUP.NEXTVAL INTO V_GROUPID FROM DUAL;
                INSERT INTO S_FIBERPATH_GROUP (SID,FIBERPATH_NUM,A_SECTOP,Z_SECTOP,CITY_CODE) 
                VALUES(V_GROUPID,0,C2.A_SECTOP,V_NEWSID,V_CITYCODE); 
        END; 
        
        -- +1   
        UPDATE S_FIBERPATH_GROUP SET FIBERPATH_NUM=FIBERPATH_NUM+1 WHERE SID=V_GROUPID;
        
        --  -1
        SELECT FIBERPATH_NUM INTO V_NUM FROM S_FIBERPATH_GROUP WHERE SID=C2.GROUP_ID;
        
        IF V_NUM -1 <=0 THEN
            DELETE S_FIBERPATH_GROUP WHERE SID=C2.GROUP_ID;
        ELSE
            UPDATE S_FIBERPATH_GROUP SET FIBERPATH_NUM=FIBERPATH_NUM-1 WHERE SID=C2.GROUP_ID;
        END IF;
        
         --按 sid 改 fiberpath
        UPDATE S_FIBERPATH SET Z_SECTOP=V_NEWSID,GROUP_ID=V_GROUPID WHERE SID=C2.SID;
    
    END LOOP;


   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END P_UPDATE_FIBERPATH;

函数

CREATE OR REPLACE FUNCTION NRMS.f_cpid2name(in_cpid NUMBER )
RETURN VARCHAR2
AS
    v_name VARCHAR2(200);
    cursor cr is  select sname  from s_checkpoint where sid=in_cpid;
BEGIN
    v_name:='';
  /**传入 正的sid 根据流程id 找到其对应的名称**/
   for c1 in cr loop
   v_name:= c1.sname;
   exit;
 end loop; 
 RETURN v_name;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END f_cpid2name;

类型 table分装

  • 封装类型
  • 封装table
DROP TYPE IPRAN.TYPE_REC;

CREATE OR REPLACE TYPE IPRAN.TYPE_REC is object (ID VARCHAR2(30), 
    APPLY_ID varchar2(30), 
    FLOWID VARCHAR2(30),
    FLOWNAME VARCHAR2(100),
    TASKNAME VARCHAR2(100),
    STARTDATE VARCHAR2(50),
    ENDDATE VARCHAR2(50),
    YQWCDATE VARCHAR2(50),
    STS VARCHAR2(30),
    TASKOWNER VARCHAR2(20),
    STATE VARCHAR2(20)
);
DROP TYPE IPRAN.TYPE_TB;

CREATE OR REPLACE TYPE IPRAN.TYPE_TB is table of TYPE_REC;

相关文章

网友评论

      本文标题:oracle 过程实例 函数 以及table的封装

      本文链接:https://www.haomeiwen.com/subject/idiijqtx.html