1. 程式人生 > 資料庫 >oracle 多數值錄入校驗(分隔符“/”)

oracle 多數值錄入校驗(分隔符“/”)

PROCEDURE Check_New_Multivalue (
   c_multivalued_ IN VARCHAR2  )
IS
   multivalue_temp_ NUMBER;
   lov_temp_ NUMBER;
   multivalue_start_ NUMBER;
   multivalue_end_ NUMBER;
   multivalue_sub_ VARCHAR2(10);
   multivalue_trim_ VARCHAR2(10);
   multivalue_index_ NUMBER;
   multivalue_len_ NUMBER;
   multivalue_minus_ NUMBER;
   separator_number_ NUMBER;
   
   CURSOR get_lov(c_multivalued_sub_ VARCHAR2) IS
      SELECT count(1) FROM C_MULTIVALUED_LOV WHERE multivalued_text=c_multivalued_sub_;
BEGIN
      OPEN get_lov(c_multivalued_);
      FETCH get_lov INTO lov_temp_;
      CLOSE get_lov;
      IF (lov_temp_ = 0) THEN 
         multivalue_start_ := instr(c_multivalued_,'/');
         multivalue_len_ := length(c_multivalued_);
         multivalue_sub_ := substr(c_multivalued_, 0, multivalue_start_-1);
         multivalue_trim_ := trim(multivalue_sub_);
         IF( multivalue_start_ = 0 OR multivalue_start_=multivalue_len_ ) THEN
            OPEN get_lov(multivalue_trim_);
            FETCH get_lov INTO separator_number_;
            CLOSE get_lov;
            IF(separator_number_=0) THEN
               Error_SYS.Record_General(lu_name_, 'CHECKLOT: 多數值文字框不允許錄入單個數值');
            END IF;
         END IF;         
         IF(length(multivalue_sub_)>length(trim(multivalue_sub_))) THEN
            Error_SYS.Record_General(lu_name_, 'CHECKLOT: 不允許錄入空格');
         END IF;                 
         OPEN get_lov(multivalue_trim_);
         FETCH get_lov INTO separator_number_;
         CLOSE get_lov;
         IF(separator_number_=0) THEN
            multivalue_temp_ :=  CAST(multivalue_sub_ AS NUMBER);
         END IF;         
         WHILE ( multivalue_start_ > 0 ) LOOP
            multivalue_index_ := multivalue_start_ + 1;
            multivalue_end_ := instr(c_multivalued_,'/',multivalue_index_);
            IF(multivalue_index_ = multivalue_end_) THEN
               Error_SYS.Record_General(lu_name_, 'CHECKLOT: 只能用一個/分隔');
            END IF;
            IF(multivalue_end_ = 0) THEN
               multivalue_len_ := length(c_multivalued_);
               multivalue_minus_ := multivalue_len_ + 1 - multivalue_index_;
            ELSE
                multivalue_minus_ := multivalue_end_-multivalue_index_;
            END IF;
            multivalue_sub_ := substr(c_multivalued_, multivalue_index_, multivalue_minus_);
            IF(length(multivalue_sub_)>length(trim(multivalue_sub_))) THEN
                  Error_SYS.Record_General(lu_name_, 'CHECKLOT: 不允許錄入空格');
            END IF;            
            multivalue_trim_ := trim(multivalue_sub_);
            OPEN get_lov(multivalue_trim_);
            FETCH get_lov INTO separator_number_;
            CLOSE get_lov;
            IF(separator_number_=0) THEN
               multivalue_temp_ :=  CAST(multivalue_sub_ AS NUMBER);
            END IF;
            multivalue_start_ := multivalue_end_ ;
         END LOOP;
      END IF;
EXCEPTION 
   WHEN value_error THEN
       Error_SYS.Record_General(lu_name_, 'CHECKLOT: 多數值部分用來填寫多個數字或選擇值列表中的字元,多個數字用/隔開');
END Check_New_Multivalue;