title: PLS-00323 subprogram or cursor 'CPQ_DATA_HANDLE___' is declared in Package specification and must be defined in the package body
body: <p>I can't seem execute my package body when I add a new procedure.</p>
  
  <p>Can anyone tell me what I am missing e.g. References to the Package etc.</p>
  
  <p>I am struggling to see where I have gone wrong.</p>
  
  <p>Thank you for your help in advance.</p>
  
  <p>Package</p>
  
  <pre><code>    CREATE OR REPLACE PACKAGE TEST.CPQ_QUOTE_DATA_API IS
  
  
  
   FUNCTION Check_Exist___ (
  PROJECT_ID_ IN VARCHAR2,
  SUB_PROJECT_ IN VARCHAR2,
  ACTIVITY_ID_ IN VARCHAR2,
  ORDER_NO_ IN VARCHAR2,
  PART_NO_ IN VARCHAR2) RETURN BOOLEAN;
  
      PROCEDURE CPQ_DATA_HANDLE___ ( 
      PROJECT_ID_ IN VARCHAR2,
      SUB_PROJECT_ IN VARCHAR2,
      ACTIVITY_ID_ IN VARCHAR2,
      ORDER_NO_ IN VARCHAR2,
      PART_NO_ IN VARCHAR2,
      QTY_ IN NUMBER,
      PRICE_COST_ IN NUMBER,
      GPARTCOST_ IN NUMBER,
      CPQ_DATE_ IN VARCHAR2,
      DATECREATED_ IN VARCHAR2);
  
  END CPQ_QUOTE_DATA_API;
  </code></pre>
  
  <p>Package Body </p>
  
  <pre><code>CREATE OR REPLACE PACKAGE BODY TEST.CPQ_QUOTE_DATA_API IS
  
  FUNCTION Check_Exist___ (
      PROJECT_ID_ IN VARCHAR2,
      SUB_PROJECT_ IN VARCHAR2,
      ACTIVITY_ID_ IN VARCHAR2,
      ORDER_NO_ IN VARCHAR2,
      PART_NO_ IN VARCHAR2) RETURN BOOLEAN
      IS
         dummy_ NUMBER;
         CURSOR exist_control IS
            SELECT 1
            FROM   CPQ_QUOTE_DATA_TAB
            WHERE PROJECT_ID_ = PROJECT_ID
            AND SUB_PROJECT_ = SUB_PROJECT
            AND ACTIVITY_ID_ = ACTIVITY_ID
            AND ORDER_NO_ = ORDER_NO
            AND PART_NO_ = PART_NO;
      BEGIN
         OPEN exist_control;
         FETCH exist_control INTO dummy_;
         IF (exist_control%FOUND) THEN
            CLOSE exist_control;
            RETURN(TRUE);
         END IF;
         CLOSE exist_control;
         RETURN(FALSE);
      END Check_Exist___;
  
  PROCEDURE CPQ_DATA_HANDLE___  
  
  as
     PROJECT_ID_    VARCHAR2(10 CHAR);
    SUB_PROJECT_   VARCHAR2(10 CHAR);
    ACTIVITY_ID_  VARCHAR2(10 CHAR);
    ORDER_NO_     VARCHAR2(12 CHAR);
    PART_NO_      VARCHAR2(25 CHAR);
    QTY_          NUMBER;
    PRICE_COST_    NUMBER;
    GPARTCOST_    NUMBER;
    CPQ_DATE_     VARCHAR2(50 CHAR);
    DATECREATED_  VARCHAR2(50 CHAR);
  
     CURSOR get_record IS 
        SELECT *
          FROM TEST.WTS_CPQ_DATA_TRANS_TAB; 
  
  GetRec get_record%ROWTYPE;
  
  BEGIN 
  
  open get_record;
  loop
  fetch get_record into GetRec;
  
  exit when get_record%NOTFOUND;
  
    PROJECT_ID_        :=  GetRec.PROJECT_ID; 
    SUB_PROJECT_       :=  GetRec.SUB_PROJECT;
    ACTIVITY_ID_       :=  GetRec.ACTIVITY_ID;
    ORDER_NO_          :=  GetRec.ORDER_NO;
    PART_NO_           :=  GetRec.PART_NO;
    QTY_               :=  GetRec.QTY; 
    PRICE_COST_        :=  GetRec.PRICE_COST;
    GPARTCOST_         :=  GetRec.GPARTCOST;
    CPQ_DATE_          :=  GetRec.CPQ_DATE;
    DATECREATED_      :=  GetRec.DATECREATED;
  
  IF TEST.CPQ_QUOTE_DATA_API.CHECK_EXIST___(PROJECT_ID_, SUB_PROJECT_, ACTIVITY_ID_, ORDER_NO_, PART_NO_) = TRUE 
  
  THEN 
  
  insert into TEST.WTS_CPQ_ERROR_DATA
  
  (PROJECT_ID,SUB_PROJECT,ACTIVITY_ID,ORDER_NO,PART_NO,QTY,PRICE_COST,GPARTCOST,CPQ_DATE,DATE_CREATED) 
  
  VALUES
  
  (PROJECT_ID_,SUB_PROJECT_,ACTIVITY_ID_,ORDER_NO_,PART_NO_,QTY_,PRICE_COST_,GPARTCOST_,CPQ_DATE_,DATECREATED_) 
  ;
  COMMIT;
  
  ELSE 
  
  insert into TEST.CPQ_QUOTE_DATA_TAB
  
  (PROJECT_ID,SUB_PROJECT,ACTIVITY_ID,ORDER_NO,PART_NO,QTY,PRICE_COST,GPARTCOST,CPQ_DATE,DATE_CREATED) 
  
  VALUES
  
  (PROJECT_ID_,SUB_PROJECT_,ACTIVITY_ID_,ORDER_NO_,PART_NO_,QTY_,PRICE_COST_,GPARTCOST_,CPQ_DATE_,DATECREATED_) 
  ;
  COMMIT;
  
  END IF;
  
  
    END LOOP; 
  close get_record;
  END CPQ_DATA_HANDLE___;
  
  END CPQ_QUOTE_DATA_API;
  </code></pre>