oracle包

oracle包

--//規範
--//注意 : 如果有遊標則必須有返回類型
CREATE OR REPLACE PACKAGE myPkg
AS
PROCEDURE findAvgScore(p_stuName VARCHAR2,p_AvgScore OUT NUMBER);
FUNCTION hello(p_name VARCHAR2)RETURN VARCHAR2;
CURSOR stuInfoCur RETURN stuInfo%ROWTYPE;
END;

--//主體
--//注意 : 遊標的實現放在開始部分
CREATE OR REPLACE PACKAGE BODY myPkg
AS
  --//實現遊標
  CURSOR stuInfoCur RETURN stuInfo%ROWTYPE IS SELECT * FROM stuInfo;
  --//實現PROCEDURE
  PROCEDURE findAvgScore
   (p_stuName VARCHAR2,p_AvgScore OUT NUMBER)
  AS
  BEGIN
    SELECT AVG(b.score) INTO p_AvgScore FROM stuInfo a, stuScore b
      WHERE a.stuId = b.stuID
      AND a.stuName = p_stuName;
  EXCEPTION
    WHEN no_data_found THEN
      DBMS_OUTPUT.PUT_LINE('no_data_found');
      p_AvgScore := 0;
    WHEN others THEN
      DBMS_OUTPUT.PUT_LINE('others');
      p_AvgScore := 0;
  END;
  --//實現FUNCTION
  FUNCTION hello
  (p_name VARCHAR2)
  RETURN VARCHAR2
  AS
  BEGIN
   RETURN p_name || '你好!';
  END;
END;


SET SERVEROUTPUT ON;
--//調用包中的FUNCTION
SELECT myPkg.hello('ACCP') FROM dual;
--//調用包中的PROCEDURE
DECLARE
  num NUMBER;
BEGIN
  myPkg.findAvgScore('AAA',num);
  DBMS_OUTPUT.PUT_LINE('平均成績 ' || num);
END;
--//調用包中的CURSOR
BEGIN
  FOR stuRec IN myPkg.stuInfoCur
  LOOP
    DBMS_OUTPUT.PUT_LINE('姓名 : '||stuRec.stuName);
    DBMS_OUTPUT.PUT_LINE('年齡 : '||stuRec.stuAge);
    DBMS_OUTPUT.PUT_LINE('=========================');
  END LOOP;
END;


--//查看當前用戶過程
 select object_name FROM user_objects WHERE object_type = 'PROCEDURE';
--//查看當前用戶的過程代碼,名稱需要大寫
 select text from user_source where name='HELLO';
 
--//業務處理例子。包裏邊返回遊標
--//規範
CREATE OR REPLACE  PACKAGE RET_CURSOR
AUTHID CURRENT_USER
AS 
TYPE RefCursor IS REF CURSOR;
FUNCTION GET_LBTRACK
 (
  fromDate IN varchar2,
  endDate IN varchar2,
  cusType IN varchar2,
  cusName IN varchar2,
  transType IN varchar2,
  toCity IN varchar2,
  deptPurview IN varchar2,
  carrierPurview IN varchar2,
  deptNo IN varchar2
 )
 RETURN RefCursor;
FUNCTION GET_LBASSURANCE
 (
  fromDate IN varchar2,
  endDate IN varchar2,
  cusType IN varchar2,
  cusName IN varchar2,
  transType IN varchar2,
  printBillNo IN varchar2,
  deptPurview IN varchar2,
  carrierPurview IN varchar2
 )
 RETURN RefCursor;
end;

--//主體
CREATE OR REPLACE  PACKAGE BODY RET_CURSOR as 
FUNCTION GET_LBTRACK
  (
  fromDate IN varchar2,
  endDate IN varchar2,
  cusType IN varchar2,
  cusName IN varchar2,
  transType IN varchar2,
  toCity IN varchar2,
  deptPurview IN varchar2,
  carrierPurview IN varchar2,
  deptNo IN varchar2
  )
RETURN RefCursor
AS
  C_LBNO RefCursor;
  C_OUTBILLNO RefCursor;
  C_OUTBILLINFO RefCursor;
  C_LBDETAIL RefCursor;
  C_LBTRACK RefCursor;
  R_LBNO OT_LBHEAD%ROWTYPE;
  fDate date;
  tDate date;
  sqlSTR varchar2(1000) := '';
  sqlCreate varchar2(1000) := '';
  isEXIST integer;
 
  numItem   number(10,0);
  numWeight number(10,0);
  numVolume number(10,0);
 
  numIncome number(10,0);
  charAgentTel  varchar2(50) := '';
  charAgentName  varchar2(100) := '';
  charCarrier  varchar2(100) := '';
  charOutBillNo varchar2(50);
 
  charItemNo    varchar2(100);
  numItemNum    number(10,0);
  tempItemNo    varchar2(100);
  tempItemNum    number(10,0);
  charTransType varchar2(10);
  charAccountType varchar2(10);
  numItemCount  number(10,0) := 0;
  recCount  number(10,0) := 0;
 
  sqlInsOne    varchar2(500);
  sqlInsTwo    varchar2(500);
 
  charItemName   mt_item.v_itemname%type;
  charContact    mt_receiver.v_contact%type;

BEGIN
  fDate := TO_DATE(fromDate,'yyyy-mm-dd');
  tDate := TO_DATE(endDate,'yyyy-mm-dd')+1;
  sqlSTR := 'SELECT * FROM OT_LBHEAD WHERE D_DESIGNATIONDATE IS NOT NULL ';
  IF TRIM(deptNo) = '' OR deptNo IS NULL THEN
    sqlSTR := sqlSTR || 'AND V_DEPTNO IN (' || deptPurview ||') ';
  ELSE
    sqlSTR := sqlSTR || 'AND V_DEPTNO =''' || deptNo ||''' ';
  END IF; 
  IF TRIM(cusType) = '-1' THEN
    sqlSTR := sqlSTR || 'AND V_BRANCHCODE = ''-1'' ';
  ELSE
    sqlSTR := sqlSTR || 'AND V_BRANCHCODE IN (' || carrierPurview ||') ';
  END IF;
  sqlSTR := sqlSTR || 'AND D_OPERATEDATE >= ''' || fDate ||''' ';
  sqlSTR := sqlSTR || 'AND D_OPERATEDATE <= ''' || tDate ||''' ';
  IF transType IS NOT NULL OR TRIM(transType) <>'' THEN
    sqlSTR := sqlSTR || 'AND V_TRANSTYPE = ''' || transType ||''' ';
  END IF;
  IF toCity IS NOT NULL OR TRIM(toCity) <> '' THEN
    sqlSTR := sqlSTR || 'AND V_PORTTO = ''' || toCity ||''' ';
  END IF;
  IF cusName IS NOT NULL OR TRIM(cusName) <> '' THEN
    sqlSTR := sqlSTR || 'AND V_BRANCHCODE = ''' || cusName ||''' ';
  END IF;
  sqlSTR := sqlSTR || 'ORDER BY D_OPERATEDATE,V_LBNO';
  --build temp. table (do not use create directly)
  sqlCreate := 'CREATE GLOBAL TEMPORARY TABLE TEMPTRACK ' 
    ||'(V_ORDERDATE VARCHAR2(10) DEFAULT '' '',V_PRINTNO   VARCHAR2(20)  DEFAULT '' '',V_RECEIVER  VARCHAR2(100) DEFAULT '' '',V_CONTACT  VARCHAR2(100) DEFAULT '' '','
 ||'V_TOCITY     VARCHAR2(50) DEFAULT '' '',V_TRANSTYPE VARCHAR2(10) DEFAULT '' '',N_ITEMNUM   NUMBER(10,0)  DEFAULT     0,'
 ||'N_WEIGHT     NUMBER(10,0) DEFAULT      0,V_SEND    VARCHAR2(100) DEFAULT '' '',V_PAY       VARCHAR2(10)  DEFAULT '' '','
 ||'V_ITEM      VARCHAR2(100) DEFAULT '' '',V_ITEMNAME VARCHAR2(100) DEFAULT '' '',N_PCS       NUMBER(10,0) DEFAULT     0,V_VOLUME    VARCHAR2(20)  DEFAULT '' '','
 ||'V_AGENTLBNO  VARCHAR2(20) DEFAULT '' '',V_AGENTTEL VARCHAR2(150) DEFAULT '' '',V_FLIGHT    VARCHAR2(50)  DEFAULT '' '','
 ||'V_DUE        VARCHAR2(20) DEFAULT '' '',V_SIGN      VARCHAR2(20) DEFAULT '' '',V_DUEREMARK VARCHAR2(100) DEFAULT '' '','
 ||'V_CARRIER   VARCHAR2(100) DEFAULT '' '',N_INCOME    NUMBER(10,2)  )ON COMMIT PRESERVE ROWS';
  SELECT COUNT(*) INTO isEXIST FROM ALL_TABLES WHERE TABLE_NAME='TEMPTRACK';
  --sqlCreate:='drop table TEMPTRACK';
 
 
  IF isEXIST = 0 THEN
    EXECUTE IMMEDIATE sqlCreate;
  ELSE
    EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMPTRACK';
  END IF;
  --process lbbill loop
  OPEN C_LBNO FOR sqlSTR;
     LOOP
       FETCH C_LBNO INTO R_LBNO;
     EXIT WHEN C_LBNO%NOTFOUND;
--sp_ExceptionParaLog('RET_CURSOR-11','R_LBNO='||R_LBNO.V_LBNO);
     --query detail
    SELECT SUM(DECODE(V_CALTYPE,'件數',N_QTY,0))+SUM(DECODE(V_CALTYPE,'重量',N_QTY,0)) f_item,
      SUM(DECODE(V_CALTYPE,'重量',N_CHARGEWEIGHT,0)) f_weight
   INTO numItem,numWeight
   FROM OT_LBDETAIL WHERE V_LBNO=R_LBNO.V_LBNO;
    --query income
    SELECT SUM(N_COST) INTO numIncome FROM OT_LBCOST
      WHERE V_COSTCODE NOT IN ('TOTAL','LBIN')
   AND V_TYPE= '1'
   AND V_LBNO=R_LBNO.V_LBNO;
    --query agent tel.
    SELECT COUNT(*) INTO recCount FROM OT_COMPANY WHERE V_COMPANYCODE=R_LBNO.V_COMPANYCODE;
    IF recCount > 0 THEN
     SELECT V_COMPANYNAME,V_TELEPHONE INTO charAgentName,charAgentTel
      FROM OT_COMPANY
      WHERE V_COMPANYCODE=R_LBNO.V_COMPANYCODE;
    END IF;
    recCount := 0;
    --query carrier tel.
    SELECT COUNT(*) INTO recCount FROM MT_CARRIER WHERE V_CARRIERCODE=R_LBNO.V_BRANCHCODE;
    IF recCount > 0 THEN
     SELECT V_CARRIERNAME INTO charCarrier
      FROM MT_CARRIER
      WHERE V_CARRIERCODE=R_LBNO.V_BRANCHCODE;
    END IF;
   
    ---------------------------------
    recCount := 0;
    --query carrier tel.
    SELECT COUNT(*) INTO recCount FROM MT_RECEIVER WHERE V_RECEIVERCODE=R_LBNO.V_RECEIVERCODE;
    --sp_ExceptionLog('R_LBNO.V_RECEIVERCODE======'||R_LBNO.V_RECEIVERCODE);
    IF recCount > 0 THEN
     SELECT nvl(V_CONTACT,'') INTO charContact
      FROM MT_RECEIVER
      WHERE V_RECEIVERCODE=R_LBNO.V_RECEIVERCODE;
    ELSE
      charContact:=R_LBNO.V_RECEIVERNAME; 
    END IF;   
    ---------------------------------
    recCount := 0;
    --query transtype
    SELECT V_TRANSNAME INTO charTransType FROM D_TRANSTYPE
      WHERE V_TRANSTYPE=R_LBNO.V_TRANSTYPE;
    --query paytype
    SELECT COUNT(*) INTO recCount FROM D_ACCOUNTTYPE WHERE V_ACCOUNTTYPE=R_LBNO.V_ACCOUNTTYPE;
    IF recCount > 0 THEN
     SELECT V_ACCOUNTDESC INTO charAccountType FROM D_ACCOUNTTYPE
      WHERE V_ACCOUNTTYPE=R_LBNO.V_ACCOUNTTYPE;
    END IF;
    recCount := 0;
    --insert temp. table
   IF R_LBNO.V_BRANCHCODE <> '-1' THEN
    OPEN C_OUTBILLNO FOR
      SELECT V_BILLNO FROM OT_LBBILL WHERE V_LBNO=R_LBNO.V_LBNO;  
    LOOP
      FETCH C_OUTBILLNO INTO charOutBillNo;
   EXIT WHEN C_OUTBILLNO%NOTFOUND;
   OPEN C_OUTBILLINFO FOR
     SELECT a.V_ITEMNO,nvl(b.v_Itemname,''),a.N_TRANSQTY
       FROM MT_TRANSACTION a,MT_ITEM b WHERE a.v_itemno=b.v_itemno(+) and a.V_BILLNO=charOutBillNo;
     LOOP
     numItemCount := numItemCount + 1;
     FETCH C_OUTBILLINFO INTO charItemNo,charItemname,numItemNum;
    
      
    
     EXIT WHEN C_OUTBILLINFO%NOTFOUND;
      IF numItemCount = 1 THEN
          sqlInsOne := 'INSERT INTO TEMPTRACK VALUES ('
                 ||''''||TO_CHAR(R_LBNO.D_ORDERDATE,'yyyy-mm-dd')||''','
     ||''''||R_LBNO.V_BILLNO||''','
     ||''''||R_LBNO.V_RECEIVERNAME||''','
     ||''''||charContact||''','
     ||''''||R_LBNO.V_PORTNAMETO||''','
     ||''''||charTransType||''','
     ||''''||numItem||''','
     ||''''||numWeight||''','
     ||''''||R_LBNO.V_HANDLEINFO||R_LBNO.V_ACCOUNTINFO||''','
     ||''''||charAccountType||''','
     ||''''||charItemNo||''','
     ||''''||charItemName||''','
     ||''''||numItemNum||''','
     ||'''0'','
     ||''''||R_LBNO.V_AGENTBILLNO||''','
     ||''''||charAgentName||'/'||charAgentTel||''','
     ||''''||R_LBNO.V_FREIGHTNO||'/'||TO_CHAR(R_LBNO.D_FREIGHTDATE,'yyyy-mm-dd')||''','
     ||''''||TO_CHAR(R_LBNO.D_DUEDATE,'yyyy-mm-dd')||''','
     ||''''||R_LBNO.V_CONTACT||''','
     ||''''||R_LBNO.V_DUEDESC||''','
     ||''''||charCarrier||''','
     ||''''||numIncome||''')';
--sp_ExceptionParaLog('RET_CURSOR-2','sqlInsOne='||sqlInsOne);
             EXECUTE IMMEDIATE sqlInsOne;
     ELSE
          sqlInsTwo := 'INSERT INTO TEMPTRACK (V_ITEM,N_PCS) VALUES ('
     ||''''||charItemNo||''','
     ||''''||numItemNum||''')';
--sp_ExceptionParaLog('RET_CURSOR-3','sqlInsTwo='||sqlInsTwo);
             EXECUTE IMMEDIATE sqlInsTwo;
     END IF;
     END LOOP;
   CLOSE C_OUTBILLINFO;
    END LOOP;
    CLOSE C_OUTBILLNO;
   ELSE
    OPEN C_LBDETAIL FOR
      SELECT V_ITEMNAME,N_QTY INTO charItemNo,numItemNum FROM OT_LBDETAIL
        WHERE V_LBNO=R_LBNO.V_LBNO; 
     charItemname:=charItemNo;
--sp_ExceptionParaLog('RET_CURSOR-8','charItemNo='||charItemNo);
      LOOP
   FETCH C_LBDETAIL INTO tempItemNo,tempItemNum;
   EXIT WHEN C_LBDETAIL%NOTFOUND;
   charItemNo := charItemNo ||tempItemNo||'/';
   numItemNum := numItemNum +  tempItemNum;
   END LOOP;  
    CLOSE C_LBDETAIL;
    sqlInsOne := 'INSERT INTO TEMPTRACK VALUES ('
                 ||''''||TO_CHAR(R_LBNO.D_OPERATEDATE,'yyyy-mm-dd')||''','
     ||''''||R_LBNO.V_BILLNO||''','
     ||''''||R_LBNO.V_RECEIVERNAME||''','
     ||''''||charContact||''','
     ||''''||R_LBNO.V_PORTNAMETO||''','
     ||''''||charTransType||''','
     ||''''||numItem||''','
     ||''''||numWeight||''','
     ||''''||R_LBNO.V_HANDLEINFO||R_LBNO.V_ACCOUNTINFO||''','
     ||''''||charAccountType||''','
     ||''''||charItemNo||''','
     ||''''||charItemName||''','
     ||''''||numItemNum||''','
     ||'''0'','
     ||''''||R_LBNO.V_AGENTBILLNO||''','
     ||''''||charAgentName||'/'||charAgentTel||''','
     ||''''||R_LBNO.V_FREIGHTNO||'/'||TO_CHAR(R_LBNO.D_FREIGHTDATE,'yyyy-mm-dd')||''','
     ||''''||TO_CHAR(R_LBNO.D_DUEDATE,'yyyy-mm-dd')||''','
     ||''''||R_LBNO.V_CONTACT||''','
     ||''''||R_LBNO.V_DUEDESC||''','
     ||''''||R_LBNO.V_FULLNAME||''','
     ||''''||numIncome||''')';
--sp_ExceptionParaLog('RET_CURSOR-4','sqlInsOne='||sqlInsOne);
    EXECUTE IMMEDIATE sqlInsOne;
    charItemNo := ''; 
    numItemNum := 0;
   END IF;
   numItemCount := 0;
     END LOOP;
  CLOSE C_LBNO;
  OPEN C_LBTRACK FOR 'SELECT * FROM TEMPTRACK';
  RETURN C_LBTRACK;
  EXCEPTION
    WHEN OTHERS THEN
   ROLLBACK;
   sp_ExceptionLog('RET_CURSOR-1');
   RETURN C_LBTRACK;
END;
FUNCTION GET_LBASSURANCE
 (
  fromDate IN varchar2,
  endDate IN varchar2,
  cusType IN varchar2,
  cusName IN varchar2,
  transType IN varchar2,
  printBillNo IN varchar2,
  deptPurview IN varchar2,
  carrierPurview IN varchar2
 )
 RETURN RefCursor
 AS
   C_LBASSURANCE RefCursor;
 BEGIN
 RETURN C_LBASSURANCE;
 END;
END;

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