文字列を複数回分割するための比較的複雑なストアド プロシージャ

黄舟
リリース: 2017-02-16 13:19:57
オリジナル
1294 人が閲覧しました

私が書いた特別な 分割関数は次のとおりです:
関数 FN_SPLIT_STR_2(var_str in varchar2)return varchar2
/* を作成または置換します
のフィールドc3 と呼ばれる関数には、すべての店舗の位置情報が保存されます。
今度は、すべてのレコードの c3 フィールドの座標値を 3 倍にして c フィールドに書き込むストアド プロシージャが必要です。内容はそれぞれ 220.25 257,220.25 269.75,229.25 269.75,229.25 257

です。カンマは座標点を 1 つずつ区切ります。各座標点はスペースを使用して x 座標と y 座標を区別します。
author:huangshan
*/


as
  var_tmp     varchar2(4000);
  var_element varchar2(4000);
  var_result varchar2(4000);
  var_instr_first number;
  var_instr_second number;
  var_length number;
ログイン後にコピー


begin

  var_tmp := var_str;
  var_instr_first :=0;
  var_instr_second :=0;
  var_result :='';
  var_length:=0;
ログイン後にコピー
などの座標を更新します



/* 渡されたものを置き換えます特殊文字
chr(9) タブ文字
chr(10) キャリッジリターン

chr(13) ラインフィード
*/

  var_tmp:= replace(var_tmp,chr(10),'');
  var_tmp:= replace(var_tmp,chr(13),'');
  var_tmp:= replace(var_tmp,chr(9),'');
  
  while instr(var_tmp, ' ') > 0 
    or instr(var_tmp, ',')>0 
    or(var_length>0) loop
    var_instr_first :=instr(var_tmp, ' ');
    var_instr_second :=instr(var_tmp, ',');
   -- dbms_output.put_line('var_instr_kg:'||var_instr_first||'  ');
   -- dbms_output.put_line('var_instr_dh:'||var_instr_second||'  ');
         var_length:=length(var_tmp);
   --  dbms_output.put_line('var_length  :'||var_length||'  ');
ログイン後にコピー


/* 1 最初の場合 12 32,12 32**/

  if var_instr_first<var_instr_second  then
         var_element := round(to_number(substr(var_tmp, 1, var_instr_first-1))/3,2);
         var_result := var_result|| var_element|| &#39; &#39;;
         var_tmp := substr(var_tmp,var_instr_first+1, length(var_tmp));
      --   dbms_output.put_line(&#39;var_result kg:&#39;||var_result);
      --   dbms_output.put_line(&#39;var_tmp kg:&#39;||var_tmp||&#39;  &#39;);
      --   dbms_output.put_line(&#39;var_element kg:&#39;||var_element||&#39;  &#39;);
ログイン後にコピー


/* などのスペースがあります。 2 スペースがインターセプトされている場合は、カンマが前にあります。として 32,12 32** /

  elsif var_instr_first>var_instr_second and  var_instr_second>0 then
           var_element := round(to_number(substr(var_tmp, 1, var_instr_second-1))/3,2);
           var_result := var_result || var_element || &#39;,&#39; ;
           var_tmp := substr(var_tmp,var_instr_second+1, length(var_tmp));
         --  dbms_output.put_line(&#39;var_result dh:&#39;||var_result);
        --   dbms_output.put_line(&#39;var_tmp dh:&#39;||var_tmp||&#39;  &#39;);
        --   dbms_output.put_line(&#39;var_element dh:&#39;||var_element||&#39;  &#39;);
ログイン後にコピー



/* 3 如果是已经截取完逗号,已经只剩下最后一个坐标x y,比如12 32这类 **/

 elsif var_instr_first>var_instr_second and  var_instr_second=0 then
         var_element := round(to_number(substr(var_tmp, 1, var_instr_first-1))/3,2);
         var_result := var_result|| var_element|| &#39; &#39;;
         var_tmp := substr(var_tmp,+1, length(var_tmp));
       --  dbms_output.put_line(&#39;var_result kg:&#39;||var_result);
       --  dbms_output.put_line(&#39;var_tmpvar_instr_first kg:&#39;||var_tmp||&#39;  &#39;);
        -- dbms_output.put_line(&#39;var_element kg:&#39;||var_element||&#39;  &#39;);
ログイン後にコピー



/* 4 如果是已经截取到最后一个坐标,比如32这类 **/

    elsif var_instr_first=0 and var_instr_second=0 and var_length>0 then
      --  dbms_output.put_line(&#39;var_tmp the last one:&#39;||var_tmp||&#39;  &#39;);
       var_element := round(to_number(var_tmp)/3,2);
       var_result := var_result  || var_element;
       var_tmp:=&#39;&#39;;
       --  dbms_output.put_line(&#39;var_result 0:&#39;||var_result);
       --  dbms_output.put_line(&#39;var_tmp 0:&#39;||var_tmp||&#39;  &#39;);
       --  dbms_output.put_line(&#39;var_element 0:&#39;||var_element||&#39;  &#39;);
ログイン後にコピー



/* 5 如果其他的东西,设置成''退出while循环为止 **/

     else 
       var_tmp:=&#39;&#39;;
     end if;
    -- dbms_output.put_line(&#39;     &#39;);
     
  end loop;
  return var_result;
end FN_SPLIT_STR_2;
ログイン後にコピー




-- google其他人的拆分function如下:
-- 拆分函数

create or replace function split_str(var_str   in varchar2, 
                                       var_split in varchar2) 
/**************************************************** 
  注意 先执行下面语句 创建类型 
  create or replace type t_ret_table is table of varchar2(100) 
  ** 函数名称:split_str 
  ** 参    数:【名称】         【类型 】      【说明】 
  **           var_str          varchar2       要拆分的字符串 
  **           var_split        varchar2       字符串分隔符 
  ** 返 回 值:Result           t_ret_table    拆分后数组集合 
  ** 摘    要:拆分字符串 
  调用 举例: 
  select * from table(split_str(&#39;2008-10-21&#39;,&#39;-&#39;)) 
  ****************************************************/ 
  return t_ret_table is 
  var_out     t_ret_table; 
  var_tmp     varchar2(4000); 
  var_element varchar2(4000);
ログイン後にコピー


begin

 var_tmp := var_str; 
  var_out := t_ret_table(); 
  --如果存在匹配的分割符 
  while instr(var_tmp, var_split) > 0 loop 
    var_element := substr(var_tmp, 1, instr(var_tmp, var_split) - 1); 
    var_tmp     := substr(var_tmp, 
                          instr(var_tmp, var_split) + length(var_split), 
                          length(var_tmp)); 
    --var_out.extend(1); 
    var_out.extend; 
    var_out(var_out.count) := var_element; 
  end loop; 
  --var_out.extend(1); 
  var_out.extend; 
  var_out(var_out.count) := var_tmp; 
  return var_out; 
end split_str;
ログイン後にコピー

 以上就是一个比较复杂的多次拆分字符串的存储过程的内容,更多相关内容请关注PHP中文网(www.php.cn)!


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!