Oacle 저장 프로시저 입력 XML

CREATE OR REPLACE 
PROCEDURE proc_sys_parameter(
  pi_xml  IN  CLOB,     --    (XML    )
  po_cod  OUT NUMBER,   --     (0=  , 0    )
  po_msg  OUT VARCHAR2  --      (       )
) IS
  --      
  --        
  /*
  <?xml version="1.0" encoding="utf-8"?>
  <XSF>
    <HEAD>
      <USER_ID>100</USER_ID>  <!--         ID(        -1) -->
      <OPERATE_TYPE>0</OPERATE_TYPE>  <!--     (0=  ,1=  ,-1=  ) -->
    </HEAD>
    <BODY>
      <ROWS>
        <ROW>
          <PARAMETER_KEY>AUTOMATIC_RECEIPT</PARAMETER_KEY>  <!--       -->
          <PARAMETER_VALUE>7</PARAMETER_VALUE>  <!--     -->
          <PARAMETER_NAME>    </PARAMETER_NAME>  <!--      -->
          <VALID_FLAG>1</VALID_FLAG>  <!--       (0=  ,1=  ) -->
        </ROW>
      </ROWS>
    </BODY>
  </XSF>
  */
  
  --      
  vi_count          NUMBER(2);
  vi_cod            NUMBER(6);
  vc_msg            VARCHAR2(4000);  
  vc_body           CLOB;
  vx_param_config   sys.xmlType;
  
  --         
  vi_opt_type      NUMBER(2);
  vc_param_key     t_sys_parameter_config.parameter_key%TYPE;
  vc_param_value   t_sys_parameter_config.parameter_value%TYPE;
  vc_param_name    t_sys_parameter_config.parameter_name%TYPE;
  vi_valid_flag    t_sys_parameter_config.valid_flag%TYPE;
  
  --         
  vc_opt_type_path       VARCHAR2(50) := '/XSF/HEAD/OPERATE_TYPE';
  vc_param_key_path      VARCHAR2(50) := '/XSF/BODY/ROWS/ROW/PARAMETER_KEY';
  vc_param_value_path    VARCHAR2(50) := '/XSF/BODY/ROWS/ROW/PARAMETER_VALUE';
  vc_param_name_path     VARCHAR2(50) := '/XSF/BODY/ROWS/ROW/PARAMETER_NAME';
  vc_valid_flag_path     VARCHAR2(50) := '/XSF/BODY/ROWS/ROW/VALID_FLAG';
  
  --      
  EXP_XML_PARSE   EXCEPTION;
  EXP_PARM_GET    EXCEPTION;
  EXP_PARM_CHECK  EXCEPTION;
  EXP_NOT_EXISTS  EXCEPTION;
  EXP_EXISTS      EXCEPTION;
BEGIN
 
  --     
  vi_cod  := 1;
  vc_msg  := '';

  --       
  dbms_lob.createTemporary(vc_body, TRUE);

  --        
  BEGIN
     vx_param_config := sys.xmlType.createXML(pi_xml);
  EXCEPTION
    WHEN OTHERS THEN
      vi_cod := 1;
      vc_msg := '    [CLOB]     [XMLTYPE]    ';
      RAISE EXP_XML_PARSE;
  END;

  --       
  BEGIN
    SELECT TRIM(ExtractValue(vx_param_config, vc_opt_type_path)),     --      
           TRIM(ExtractValue(vx_param_config, vc_param_key_path)),    --      
           TRIM(ExtractValue(vx_param_config, vc_param_value_path)),  --   
           TRIM(ExtractValue(vx_param_config, vc_param_name_path)),   --           
           TRIM(ExtractValue(vx_param_config, vc_valid_flag_path))    --      
      INTO vi_opt_type, vc_param_key, vc_param_value, vc_param_name, vi_valid_flag
      FROM dual;
  EXCEPTION
     WHEN OTHERS THEN
       vi_cod := 2;
       vc_msg := '         :' || SQLERRM;
       RAISE EXP_PARM_GET;
  END;
  
  --       
  IF vi_opt_type NOT IN (-1,0,1) THEN
    vi_cod := 3;
    vc_msg := '       [' || vi_opt_type || ']  !';
    RAISE EXP_PARM_CHECK;
  ELSIF vi_opt_type = 0 AND (vc_param_key IS NULL OR LENGTH(vc_param_key) = 0 OR vc_param_value IS NULL OR LENGTH(vc_param_value) = 0 OR vc_param_name IS NULL OR LENGTH(vc_param_name) = 0) THEN
    vi_cod := 3;
    vc_msg := '      :        、   、             !';
    RAISE EXP_PARM_CHECK;
  ELSIF vi_opt_type IN(-1, 1) AND (vc_param_key IS NULL OR LENGTH(vc_param_key) = 0) THEN
    vi_cod := 3;
    vc_msg := CASE WHEN vi_opt_type = -1 THEN '  ' ELSE '  ' END || '    :               !';
    RAISE EXP_PARM_CHECK;
  END IF;
  
  --       
  SELECT COUNT(t.parameter_key) INTO vi_count
    FROM t_sys_parameter_config t
   WHERE t.parameter_key = vc_param_key;
  IF vi_opt_type = 0 AND vi_count > 0 THEN
    vi_cod := 101;
    vc_msg := '      [KEY=' || vc_param_key || ']      ,        !';
    RAISE EXP_EXISTS;
  ELSIF vi_opt_type IN(-1,1) AND vi_count = 0 THEN
    vi_cod := 100;
    vc_msg := '      [KEY=' || vc_param_key || ']     ,           !';
    RAISE EXP_NOT_EXISTS;
  END IF;
  
  --    、       
  IF vi_opt_type = -1 THEN
    DELETE FROM t_sys_parameter_config t1 WHERE t1.parameter_key = vc_param_key;
  ELSE
    MERGE INTO t_sys_parameter_config ta
    USING (
      SELECT vc_param_key parameter_key, vc_param_value parameter_value, vc_param_name parameter_name, vi_valid_flag valid_flag
        FROM dual
    ) tb
    ON (ta.parameter_key = tb.parameter_key)
    WHEN MATCHED THEN
      UPDATE
         SET ta.parameter_name  = NVL(tb.parameter_name, ta.parameter_name),
             ta.parameter_value = NVL(tb.parameter_value, ta.parameter_value),
             ta.valid_flag      = NVL(tb.valid_flag, ta.valid_flag),
             ta.update_time     = SYSDATE
    WHEN NOT MATCHED THEN
      INSERT (parameter_key, parameter_value, parameter_name, valid_flag, create_time)
      VALUES (tb.parameter_key, tb.parameter_value, tb.parameter_name, NVL(tb.valid_flag,1), SYSDATE);     
  END IF;
  
  --    
  COMMIT;
  po_cod := 0;
  po_msg := CASE vi_opt_type
              WHEN -1 THEN '  '
              WHEN 0  THEN '  '
              WHEN 1  THEN '  '
         END || '      [KEY=' || vc_param_key || ']    !';
  
--    
EXCEPTION
  WHEN EXP_XML_PARSE THEN
    po_cod := vi_cod;
    po_msg := vc_msg;
  WHEN EXP_PARM_GET THEN
    po_cod := vi_cod;
    po_msg := vc_msg;
  WHEN EXP_PARM_CHECK THEN
    po_cod := vi_cod;
    po_msg := vc_msg;
  WHEN EXP_NOT_EXISTS THEN
    po_cod := vi_cod;
    po_msg := vc_msg;
  WHEN EXP_EXISTS THEN
    po_cod := vi_cod;
    po_msg := vc_msg;
  WHEN OTHERS THEN
    ROLLBACK;
    po_cod := SQLCODE;
    po_msg := CASE vi_opt_type
              WHEN -1 THEN '  '
              WHEN 0  THEN '  '
              WHEN 1  THEN '  '
           END || '      [KEY=' || vc_param_key || ']    :' || SQLERRM;
END proc_sys_parameter;

좋은 웹페이지 즐겨찾기