Oracle Function 示例01


CREATE OR REPLACE 
PACKAGE XXDM_UTIL_PKG is
/*---------------------------------------------------------
  Current Version : 1.00
  Create By       : 
  Create Date     : 
  Purpose         : public function.
  Logicality      :
---------------------------------------------------------*/

  FUNCTION xxdm_get_notice_id(p_level_id IN NUMBER,
                              p_member_id IN NUMBER) RETURN VARCHAR2;
                              
  FUNCTION xxdm_get_plan_method(p_supply_plan_id  IN NUMBER) RETURN VARCHAR2;
  
  FUNCTION xxdm_get_supply_plan_code(p_supply_plan_id  IN NUMBER) RETURN VARCHAR2;
  
  FUNCTION xxdm_get_item_category(p_item_id  IN VARCHAR2) RETURN VARCHAR2;
  
  FUNCTION get_outbound_lbfs_flag(p_item_id           IN VARCHAR2
                                  ,p_ro               IN VARCHAR2
                                  ,p_site             IN VARCHAR2  
                                  ,p_supplier         IN VARCHAR2
                                  ,p_supply_plan_id   IN NUMBER
                                  ,p_sales_date       IN VARCHAR2) RETURN NUMBER;
                              
  FUNCTION xxdm_get_additional_filter(p_table_name IN VARCHAR2,     
                                      p_level_id IN NUMBER, 
                                      p_member_id IN NUMBER) RETURN VARCHAR2;
                                      
  FUNCTION xxdm_get_substr_before_split(p_input_string in VARCHAR2, 
                                        p_split_char in VARCHAR2) RETURN VARCHAR2;
                                         
  FUNCTION xxdm_get_substr_after_split(p_input_string in VARCHAR2, 
                                       p_split_char in VARCHAR2) RETURN VARCHAR2;     
                                                                         
  FUNCTION xxdm_get_series_id_by_title(p_title in VARCHAR2) RETURN NUMBER;
  
  FUNCTION xxdm_get_ro(p_org_code in VARCHAR2) RETURN VARCHAR2;

  FUNCTION xxdm_get_org(p_org_code in VARCHAR2) RETURN VARCHAR2;
  
  PROCEDURE insert_step_log (p_notice_id          IN   VARCHAR2,
                             p_status             IN   VARCHAR2 DEFAULT 'O',
                             p_yyyy_mm_dd         IN   VARCHAR2 DEFAULT NULL,
                             p_product_line       IN   VARCHAR2 DEFAULT NULL,
                             p_ro                 IN   VARCHAR2 DEFAULT NULL,
                             p_ppp                IN   VARCHAR2 DEFAULT NULL,
                             p_fm_user            IN   VARCHAR2 DEFAULT NULL,
                             p_to_user            IN   VARCHAR2 DEFAULT NULL,
                             p_message            IN   VARCHAR2 DEFAULT NULL,
                             p_description        IN   VARCHAR2 DEFAULT NULL,
                             p_step_code          IN   VARCHAR2 DEFAULT NULL);
                             
  PROCEDURE insert_step_log_task (p_query_id           IN   NUMBER,
                                  p_status             IN   VARCHAR2 DEFAULT 'O',
                                  p_fm_user            IN   VARCHAR2 DEFAULT NULL,
                                  p_to_user_id         IN   NUMBER,
                                  p_message            IN   VARCHAR2 DEFAULT NULL,
                                  p_description        IN   VARCHAR2 DEFAULT NULL);
                                  
  PROCEDURE insert_step_log_common (p_notice_id          IN   VARCHAR2,
                                    p_status             IN   VARCHAR2 DEFAULT 'O',
                                    p_fm_user            IN   VARCHAR2 DEFAULT NULL,
                                    p_to_user            IN   VARCHAR2 DEFAULT NULL,
                                    p_message            IN   VARCHAR2 DEFAULT NULL,
                                    p_description        IN   VARCHAR2 DEFAULT NULL,
                                    p_step_code          IN   VARCHAR2 DEFAULT NULL);
  PROCEDURE insert_step_log_common2 (p_notice_id          IN   VARCHAR2,
                                    p_status             IN   VARCHAR2 DEFAULT 'O',
                                    p_fm_user            IN   VARCHAR2 DEFAULT NULL,
                                    p_to_user            IN   VARCHAR2 DEFAULT NULL,
                                    p_message            IN   VARCHAR2 DEFAULT NULL,
                                    p_description        IN   VARCHAR2 DEFAULT NULL,
                                    p_step_code          IN   VARCHAR2 DEFAULT NULL);
  
end XXDM_UTIL_PKG;
/

CREATE OR REPLACE 
PACKAGE BODY XXDM_UTIL_PKG is

  -- Get Notice ID by #LEVEL_ID#, #MEMBER_ID#
  FUNCTION xxdm_get_notice_id(p_level_id  IN NUMBER,
                              p_member_id IN NUMBER)
    RETURN VARCHAR2 IS
    RESULT        VARCHAR2(100);
    lv_sql_stmt   VARCHAR2(400);
    lv_gtable     group_tables.gtable%TYPE;
    lv_id_field   group_tables.id_field%TYPE;
    lv_data_field group_tables.data_field%TYPE;

  BEGIN

    SELECT gtable, id_field, data_field
      INTO lv_gtable, lv_id_field, lv_data_field
      FROM group_tables
     WHERE group_table_id = p_level_id;

    lv_sql_stmt := 'SELECT ' || lv_data_field || '  FROM ' || lv_gtable ||
                   ' WHERE ' || lv_id_field || '=' || p_member_id;

    EXECUTE IMMEDIATE lv_sql_stmt
      INTO RESULT;

    RETURN(RESULT);

  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
    
  END;
  
  /*---------------------------------------------------------
    Created by 
    FUNCTION:
               Get Plan Method by #MEMBER_ID#
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_supply_plan_id         supply plan id
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
  FUNCTION xxdm_get_plan_method(p_supply_plan_id  IN NUMBER)
    RETURN VARCHAR2 IS
    RESULT        VARCHAR2(100);
    v_plan_id                       NUMBER; 
  BEGIN

    SELECT plan_id
          INTO v_plan_id
          FROM supply_plan
         WHERE supply_plan_id = p_supply_plan_id;    
         
      
     SELECT md.attribute2
          INTO RESULT
          FROM apps.msc_plans mp, apps.msc_designators md
         WHERE mp.plan_id = v_plan_id
           AND mp.organization_id = md.organization_id
           AND mp.compile_designator = md.designator
           AND mp.sr_instance_id = md.sr_instance_id;

    RETURN(RESULT);

  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
    
  END;
  
  
  /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-06-03
    FUNCTION:
               Get Supply plan code
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_supply_plan_id         supply plan id
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
  FUNCTION xxdm_get_supply_plan_code(p_supply_plan_id  IN NUMBER)
    RETURN VARCHAR2 IS
    RESULT        VARCHAR2(100);
  BEGIN

    SELECT supply_plan_code
          INTO RESULT
          FROM demantra.supply_plan
         WHERE supply_plan_id = p_supply_plan_id;    
         

    RETURN(RESULT);

  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
    
  END;
  
  /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-06-03
    FUNCTION:
               Get item category
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               item_id              item id
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
  FUNCTION xxdm_get_item_category(p_item_id  IN VARCHAR2)
    RETURN VARCHAR2 IS
    RESULT        VARCHAR2(240);
  BEGIN

    SELECT cat.ebs_prod_cat INTO RESULT FROM(
        SELECT distinct c.ebs_prod_cat           
          FROM items, t_ep_item i, t_ep_line l, t_ep_ebs_prod_cat c
         WHERE i.item = p_item_id
           AND items.t_ep_item_ep_id = i.t_ep_item_ep_id
           AND items.t_ep_line_ep_id = l.t_ep_line_ep_id
           AND items.t_ep_ebs_prod_cat_ep_id = c.t_ep_ebs_prod_cat_ep_id
     ) cat;
         
    RETURN(RESULT);

  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
    
  END;
  
    /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-06-03
    FUNCTION:
               get_outbound_lbfs_flag
    LOGICALITY:
               
    INPUT:
               item_id            
               p_ro               
               p_site              
               p_supplier          
    OUTPUT:
               [return]             NUMBER
    ---------------------------------------------------------*/
  FUNCTION get_outbound_lbfs_flag(p_item_id           IN VARCHAR2
                                  ,p_ro               IN VARCHAR2
                                  ,p_site             IN VARCHAR2  
                                  ,p_supplier         IN VARCHAR2
                                  ,p_supply_plan_id   IN NUMBER
                                  ,p_sales_date       IN VARCHAR2)
    RETURN        NUMBER IS
    RESULT        NUMBER(20,10);
  BEGIN


    SELECT t_ep_outbound_lbfs_flag
      INTO RESULT
      FROM demantra.supply_plan_data
     WHERE item_id IN (
              SELECT items.item_id
                FROM demantra.t_ep_item i, demantra.items items
               WHERE i.t_ep_item_ep_id = items.t_ep_item_ep_id
                 AND i.item = p_item_id)
       AND location_id IN (
              SELECT loc.location_id
                FROM demantra.t_ep_organization o,
                     demantra.t_ep_site s,
                     demantra.t_ep_ebs_supplier ss,
                     demantra.LOCATION loc
               WHERE loc.t_ep_organization_ep_id = o.t_ep_organization_ep_id
                 AND loc.t_ep_site_ep_id = s.t_ep_site_ep_id
                 AND loc.t_ep_ebs_supplier_ep_id = ss.t_ep_ebs_supplier_ep_id
                 AND o.ORGANIZATION = p_ro
                 AND s.site = p_site
                 AND ss.ebs_supplier = p_supplier)
       AND supply_plan_id = p_supply_plan_id
       AND sales_date = TO_DATE (p_sales_date, 'YYYYMMDD');

         
    RETURN(RESULT);

  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
    
  END;
  
  /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-02-27
    FUNCTION:
               Get Additional Filter by #TABLE_NAME#, #LEVEL_ID#,#MEMBER_ID#
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_table_name        table_name
               p_level_id          level_id
               p_member_id         member_id
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
  FUNCTION xxdm_get_additional_filter
      ( p_table_name in VARCHAR2, 
        p_level_id in NUMBER, 
        p_member_id in NUMBER)
      RETURN  VARCHAR2 IS
      RESULT        VARCHAR2(200);
      v_id_field VARCHAR2(100);
    BEGIN 
        /* Formatted on 2009/03/05 09:27 (Formatter Plus v4.8.7) */
        SELECT id_field
          INTO v_id_field
          FROM group_tables
         WHERE group_table_id = p_level_id;

        RESULT:=' '||p_table_name||'.'||v_id_field||'='||p_member_id||' ';
        RETURN RESULT;
    EXCEPTION
      WHEN OTHERS THEN
        RETURN NULL;  
    END;

   /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-03-11
    FUNCTION:
               Get sub string before split char
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_input_string        input string
               p_split_char          split char
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
   FUNCTION xxdm_get_substr_before_split
      ( p_input_string in VARCHAR2, 
        p_split_char in VARCHAR2)
      RETURN  VARCHAR2 IS
      RESULT        VARCHAR2(500);
    BEGIN 
        RESULT:=substr(p_input_string,1,instr(p_input_string,p_split_char)-1);
        RETURN RESULT;
    END;
   
   /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-03-11
    FUNCTION:
               Get sub string after split char
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_input_string        input string
               p_split_char          split char
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
   FUNCTION xxdm_get_substr_after_split
      ( p_input_string in VARCHAR2, 
        p_split_char in VARCHAR2)
      RETURN  VARCHAR2 IS
      v_series_id   NUMBER;
      RESULT        VARCHAR2(500);
    BEGIN 
        RESULT:=substr(p_input_string,instr(p_input_string,p_split_char)+1);
        RETURN RESULT;
    END;

   /*---------------------------------------------------------
    Created by 
    FUNCTION:
               Get Series id by computed_title in computed_fields
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_input_string        input string
               p_split_char          split char
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
   FUNCTION xxdm_get_series_id_by_title
      (p_title in VARCHAR2)
      RETURN  NUMBER IS
      RESULT        NUMBER;
    BEGIN 
        SELECT forecast_type_id
            INTO RESULT
            FROM demantra.computed_fields
           WHERE UPPER(computed_title) = p_title;
        RETURN RESULT;
    END;
    
   /*---------------------------------------------------------
    Created by Sean Huang on 2009-06-29
    FUNCTION:
               Get RO code by ASCP org code
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_org_code        input string
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
   FUNCTION xxdm_get_ro(p_org_code in VARCHAR2)
      RETURN VARCHAR2 IS
      v_result dfs.xxascp_di_org.ro_code%TYPE;
    BEGIN
      SELECT ro_code
        INTO v_result
        FROM dfs.xxascp_di_org
       WHERE org_code = p_org_code;
        RETURN v_result;
    EXCEPTION
      WHEN OTHERS THEN
        RETURN NULL;
    END;

   /*---------------------------------------------------------
    Created 
    FUNCTION:
               Get ORG code by ASCP org code
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_org_code        input string
    OUTPUT:
               [return]             VARCHAR2
    ---------------------------------------------------------*/
   FUNCTION xxdm_get_org(p_org_code in VARCHAR2)
      RETURN VARCHAR2 IS
      v_result dfs.xxascp_di_org.oracle_org_code%TYPE;
    BEGIN
      SELECT oracle_org_code
        INTO v_result
        FROM dfs.xxascp_di_org
       WHERE org_code = p_org_code;
        RETURN v_result;
    EXCEPTION
      WHEN OTHERS THEN
        RETURN NULL;
    END;

    /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-05-06
    PROCEDURE:
               Insert step log
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_notice_id         input string
               p_status            input string
               p_process_date      sysdate
               p_fm_user           input string
               p_to_user           input string
               p_message           input string
               p_description       input string
               p_step_code         input string
               p_step_log          input string
    OUTPUT:
               [return]             
    ---------------------------------------------------------*/
    PROCEDURE insert_step_log (
     p_notice_id          IN   VARCHAR2,
     p_status             IN   VARCHAR2 DEFAULT 'O',
     p_yyyy_mm_dd         IN   VARCHAR2 DEFAULT NULL,
     p_product_line       IN   VARCHAR2 DEFAULT NULL,
     p_ro                IN   VARCHAR2 DEFAULT NULL,
     p_ppp            IN   VARCHAR2 DEFAULT NULL,
     p_fm_user            IN   VARCHAR2 DEFAULT NULL,
     p_to_user            IN   VARCHAR2 DEFAULT NULL,
     p_message            IN   VARCHAR2 DEFAULT NULL,
     p_description        IN   VARCHAR2 DEFAULT NULL,
     p_step_code          IN   VARCHAR2 DEFAULT NULL
   )
   IS
      v_id              NUMBER           := -1;
      v_step_code       VARCHAR2(50)     :='';  
      v_step_log        VARCHAR2(400)    :='';
      v_count           NUMBER           := 0;
      v_rowid           ROWID;
   BEGIN
      
      SELECT count(*) 
         INTO v_count
         FROM demantra.xxdm_step_log_master
        WHERE notice_id = p_notice_id;
      
      IF v_count >0 THEN
        --update status column in table xxdm_log_master
        UPDATE demantra.xxdm_step_log_master SET status = p_status where notice_id = p_notice_id;
      ELSE
        --insert log into xxdm_log_master
        INSERT INTO demantra.xxdm_step_log_master
                    (notice_id
                     ,yyyymmdd
                     ,product_line
                     ,ro
                     ,ppp
                     ,status)
        VALUES       (p_notice_id
                     ,p_yyyy_mm_dd
                     ,p_product_line
                     ,p_ro
                     ,p_ppp
                     ,p_status);
      END IF;
      
      v_step_code := p_step_code;
      SELECT count(*) 
         INTO v_count
         FROM demantra.xxdm_step_log_code
        WHERE step_code = v_step_code;
      IF v_count >0 THEN
          SELECT step_log
             INTO v_step_log
             FROM demantra.xxdm_step_log_code
            WHERE step_code = v_step_code;
      ELSE          
          v_step_log := 'Step Code not exists.';
      END IF;
      
      
      --insert log into xxdm_log_detail
      SELECT demantra.xxdm_step_log_detail_s.NEXTVAL
           INTO v_id
           FROM DUAL;
      INSERT INTO demantra.xxdm_step_log_detail
                    (ID
                     ,notice_id
                     ,yyyymmdd
                     ,product_line
                     ,ro
                     ,ppp
                     ,process_date
                     ,fm_user
                     ,to_user
                     ,message
                     ,description
                     ,step_code
                     ,step_log)
        VALUES       (v_id
                     ,p_notice_id
                     ,p_yyyy_mm_dd
                     ,p_product_line
                     ,p_ro
                     ,p_ppp
                     ,sysdate
                     ,p_fm_user
                     ,p_to_user
                     ,p_message
                     ,p_description
                     ,v_step_code
                     ,v_step_log)
                     returning rowid into v_rowid;   
   EXCEPTION
      WHEN OTHERS THEN
      dbms_output.put_line(sqlerrm);      
      RAISE;
   END;
   
   /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-05-06
    PROCEDURE:
               Insert step log when create a task or update a task
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_query_id          query id
               p_status            input string
               p_fm_user           input string
               p_to_user_id        input number
               p_message           input string
               p_description       input string
               p_step_code         input string
    OUTPUT:
               [return]             
    ---------------------------------------------------------*/
   PROCEDURE insert_step_log_task (
     p_query_id           IN   NUMBER,
     p_status             IN   VARCHAR2 DEFAULT 'O',
     p_fm_user            IN   VARCHAR2 DEFAULT NULL,
     p_to_user_id         IN   NUMBER,
     p_message            IN   VARCHAR2 DEFAULT NULL,
     p_description        IN   VARCHAR2 DEFAULT NULL
   )
   IS
     v_notice_id       VARCHAR2 (100);         
     v_left_notice_id  VARCHAR2 (100);      
     v_yyyy_mm_dd      VARCHAR2(8)      :='';
     v_product_line    VARCHAR2(3)      :=''; 
     v_ro              VARCHAR2(3)      :='';
     v_ppp             VARCHAR2(3)      :='';
     v_step_code       VARCHAR2 (50)    :=''; 
     v_split_char      VARCHAR2(1)      :='_';       
     v_to_user         VARCHAR2 (100)   :='';
     v_fm_user_role    VARCHAR2 (100)   :=''; 
     v_to_user_role    VARCHAR2 (100)   :='';      
     v_insert_log      BOOLEAN          :=TRUE;
     v_count           NUMBER           := 0;
     C_TPC_PLANNER   CONSTANT VARCHAR2 (50)   := 'TPC PLANNER';
     C_TPC_MANAGER   CONSTANT VARCHAR2 (50)   := 'TPC MANAGER';
     C_RO_PLANNER    CONSTANT VARCHAR2 (50)   := 'RO PLANNER';
     C_RO_MANAGER    CONSTANT VARCHAR2 (50)   := 'RO MANAGER';
     C_VENDOR        CONSTANT VARCHAR2 (50)   := 'VENDOR';
   BEGIN
   
        IF p_query_id= -1 THEN
            v_notice_id := p_message;
        ELSE
            v_notice_id := xxdm_get_notice_id(p_query_id,0);
        END IF;                
        
        --v_notice_id := '20090303_JBK_BQP_LTB_001';  -- for test
        IF v_notice_id IS NULL THEN
            dbms_output.put_line('notice id is null,p_query_id='|| p_query_id);     
        ELSE
            v_notice_id := REPLACE (v_notice_id, '-', v_split_char);
            
            v_left_notice_id := v_notice_id;
                
            v_yyyy_mm_dd:=demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char);
            v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
                        
            --get product line of notice id
            v_product_line:=demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char);
            v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
            
            --get ro of notice id    
            v_ro:=UPPER(demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char));
            v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
            
            --get ppp of notice id
            v_ppp:=UPPER(demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char));
            v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);  
       
            select company into v_fm_user_role from user_id where user_name=p_fm_user;
            select company,user_name into v_to_user_role,v_to_user from user_id where user_id=p_to_user_id;
            
            v_fm_user_role := UPPER(TRIM(v_fm_user_role));
            v_to_user_role := UPPER(TRIM(v_to_user_role));
            CASE v_ppp
                WHEN 'IRP' THEN 
                    BEGIN
                        IF v_fm_user_role=C_TPC_PLANNER AND v_to_user_role=C_TPC_MANAGER THEN
                            v_step_code := '015';
                        ELSIF v_fm_user_role=C_TPC_PLANNER AND v_to_user_role=C_RO_PLANNER THEN                        
                            v_step_code := '014';
                            --if 014 exists then v_step_code is 011
                            SELECT COUNT (*)
                              INTO v_count
                              FROM xxdm_step_log_detail
                             WHERE notice_id = v_notice_id AND step_code = v_step_code;
                            IF v_count > 0 THEN
                                v_step_code := '011';
                            END IF;
                        ELSIF v_fm_user_role=C_TPC_MANAGER AND v_to_user_role=C_TPC_PLANNER THEN  
                            v_step_code := '003';                            
                        ELSE
                            v_insert_log := FALSE;
                            DBMS_OUTPUT.PUT_LINE('user roles are not correct.from user role is '|| v_fm_user_role ||',to user role is '|| v_to_user_role || ',ppp='||v_ppp);
                        END IF;
                    END;                
                WHEN 'ROL' THEN 
                    BEGIN
                        IF v_fm_user_role=C_RO_PLANNER AND v_to_user_role=C_RO_MANAGER THEN
                            v_step_code := '012';
                        ELSIF v_fm_user_role=C_RO_MANAGER AND v_to_user_role=C_RO_PLANNER THEN                        
                            v_step_code := '003';
                        ELSIF v_fm_user_role=C_RO_PLANNER AND v_to_user_role=C_TPC_PLANNER THEN                        
                            v_step_code := '001';
                        ELSIF v_fm_user_role=C_TPC_PLANNER AND v_to_user_role=C_VENDOR THEN  
                            v_step_code := '010';
                        ELSIF v_fm_user_role=C_TPC_PLANNER AND v_to_user_role=C_RO_PLANNER THEN  
                            v_step_code := '013';
                        ELSE
                            v_insert_log := FALSE;
                            DBMS_OUTPUT.PUT_LINE('user roles are not correct.from user role is '|| v_fm_user_role ||',to user role is '|| v_to_user_role || ',ppp='||v_ppp);
                        END IF;
                    END;
                WHEN 'LTB' THEN 
                    BEGIN
                        IF v_fm_user_role=C_TPC_PLANNER AND v_to_user_role=C_RO_PLANNER THEN
                            v_step_code := '014';
                            --if 014 exists then v_step_code is 011
                            SELECT COUNT (*)
                              INTO v_count
                              FROM xxdm_step_log_detail
                             WHERE notice_id = v_notice_id AND step_code = v_step_code;
                            IF v_count > 0 THEN
                                v_step_code := '011';
                            END IF;
                        ELSIF v_fm_user_role=C_TPC_PLANNER AND v_to_user_role=C_TPC_MANAGER THEN                        
                            v_step_code := '015';
                        ELSIF v_fm_user_role=C_TPC_MANAGER AND v_to_user_role=C_TPC_PLANNER THEN  
                            v_step_code := '003';
                        ELSE
                            v_insert_log := FALSE;
                            DBMS_OUTPUT.PUT_LINE('user roles are not correct.from user role is '|| v_fm_user_role ||',to user role is '|| v_to_user_role || ',ppp='||v_ppp);
                        END IF;
                    END;
                ELSE 
                    BEGIN
                        v_insert_log := FALSE;
                        DBMS_OUTPUT.PUT_LINE('No such ppp,ppp='||v_ppp);
                    END;
            END CASE;
        
            IF v_insert_log THEN
                insert_step_log(v_notice_id,p_status,v_yyyy_mm_dd,v_product_line,v_ro,v_ppp,p_fm_user,v_to_user,p_message,p_description,v_step_code);
                COMMIT;
            END IF;
        END IF;
   EXCEPTION   
      WHEN OTHERS THEN
      ROLLBACK;
      RAISE;
   END;
   
   /*---------------------------------------------------------
    Created by Robbie.Zhu on 2009-05-06
    PROCEDURE:
               Insert step log when normal status
    LOGICALITY:
               <_____Optional_____Internal_Logic_Description>
    INPUT:
               p_notice_id         input string
               p_status            input string
               p_fm_user           input string
               p_to_user           input string
               p_message           input string
               p_description       input string
               p_step_code         input string
    OUTPUT:
               [return]             
    ---------------------------------------------------------*/
   PROCEDURE insert_step_log_common (
     p_notice_id          IN   VARCHAR2,
     p_status             IN   VARCHAR2 DEFAULT 'O',
     p_fm_user            IN   VARCHAR2 DEFAULT NULL,
     p_to_user            IN   VARCHAR2 DEFAULT NULL,
     p_message            IN   VARCHAR2 DEFAULT NULL,
     p_description        IN   VARCHAR2 DEFAULT NULL,
     p_step_code          IN   VARCHAR2 DEFAULT NULL
   )
   IS
      v_notice_id  VARCHAR2 (100);      
      v_left_notice_id  VARCHAR2 (100);      
      v_yyyy_mm_dd      VARCHAR2(8)      :='';
      v_product_line    VARCHAR2(3)      :=''; 
      v_ro              VARCHAR2(3)      :='';
      v_ppp             VARCHAR2(3)      :='';
      v_split_char      VARCHAR2(1)      :='_';
   BEGIN
        v_notice_id := REPLACE (p_notice_id, '-', v_split_char);
        
        v_left_notice_id := v_notice_id;
            
        v_yyyy_mm_dd:=demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char);
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
        
        --get product line of notice id
        v_product_line:=demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char);
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
        
        --get ro of notice id    
        v_ro:=UPPER(demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char));
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
        
        --get ppp of notice id
        v_ppp:=UPPER(demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char));
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char); 
        
        insert_step_log(v_notice_id,p_status,v_yyyy_mm_dd,v_product_line,v_ro,v_ppp,p_fm_user,p_to_user,p_message,p_description,p_step_code);
        COMMIT;
   EXCEPTION    
      WHEN OTHERS THEN
      ROLLBACK;
      RAISE;
   END;
   
   PROCEDURE insert_step_log_common2 (
     p_notice_id          IN   VARCHAR2,
     p_status             IN   VARCHAR2 DEFAULT 'O',
     p_fm_user            IN   VARCHAR2 DEFAULT NULL,
     p_to_user            IN   VARCHAR2 DEFAULT NULL,
     p_message            IN   VARCHAR2 DEFAULT NULL,
     p_description        IN   VARCHAR2 DEFAULT NULL,
     p_step_code          IN   VARCHAR2 DEFAULT NULL
   )
   IS
      v_notice_id  VARCHAR2 (100);      
      v_left_notice_id  VARCHAR2 (100);      
      v_yyyy_mm_dd      VARCHAR2(8)      :='';
      v_product_line    VARCHAR2(3)      :=''; 
      v_ro              VARCHAR2(3)      :='';
      v_ppp             VARCHAR2(3)      :='';
      v_split_char      VARCHAR2(1)      :='_';
   BEGIN
        v_notice_id := REPLACE (p_notice_id, '-', v_split_char);
        
        v_left_notice_id := v_notice_id;
            
        v_yyyy_mm_dd:=demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char);
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
        
        --get product line of notice id
        v_product_line:=demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char);
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
        
        --get ro of notice id    
        v_ro:=UPPER(demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char));
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char);
        
        --get ppp of notice id
        v_ppp:=UPPER(demantra.xxdm_util_pkg.xxdm_get_substr_before_split(v_left_notice_id,v_split_char));
        v_left_notice_id:=demantra.xxdm_util_pkg.xxdm_get_substr_after_split(v_left_notice_id,v_split_char); 
        
        insert_step_log(v_notice_id,p_status,v_yyyy_mm_dd,v_product_line,v_ro,v_ppp,p_fm_user,p_to_user,p_message,p_description,p_step_code);
   EXCEPTION    
      WHEN OTHERS THEN
      RAISE;
   END;

end XXDM_UTIL_PKG;
/




發佈了24 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章