mysqlカスタムfunction問題解決

3804 ワード

最近、会社の生産環境のシステムに需要があり、mysqlデータベースの1枚の表に大量にデータを追加する必要があります.業務部門からのデータは大体以下の通りです.
ちゅうしん
3.5 L箱(バーコード)
8 L箱(バーコード)
15 L箱(バーコード)
20 Lケース(バーコード)
浙江物流一区
6個(X 04571301-X 04571306)
8個(X 03571301-X 03571308)
4個(X 02571301-X 02571304)
12個(X 01571301-X 01571312)
浙江物流二区
24個(X 04571401-X 04571424)
42個(X 03571401-X 03571442)
78個(X 02571401-X 02571478)
36個(X 01571401-X 01571436)
このようなデータは、まず私のmacOSにサーバデータベースを接続し、データを1本1本insertに入れることを考えます.しかし、私は数十件をinsertした後、業務部門からのデータが累計700件以上あることに気づいた.私はもちろんこのようにおとなしく1本1本のinsertを望んでいません.本当に時間がかかりすぎるからです.
従来の経験から,最初に思いついたのは,テーブルをnavicatにインポートし,一括sql挿入スクリプトを生成し,サーバに転送して実行することである.しかし、業務部門が与えたExcelは、標準的な1本1本のデータではなく、上のように箱のバーコードの範囲と数を与えています.このように、私はまず標準的なExcelを生成しなければなりません.面倒です.
そして、プログラムを書く方法で、サイクルを書き、データベースに接続してデータを挿入したいと思っています.しかし、ローカル環境で生産環境のデータベースに接続するには、プロセス申請権限が必要です.プロセスが1、2日かかる可能性があります.ビジネス部門はこのデータを急いでいます.この方法はまた捨てられます.次の方法しか使用できません.
mysqlカスタムfunctionによる一括追加データの実現
mysql定義function構文は次のとおりです.
CREATE FUNCTION func_name ( [func_parameter] ) //      ,        
RETURNS type  
[ characteristic ...] routine_body 
  • CREATE FUNCTION関数を作成するためのキーワード
  • func_nameは関数の名前
  • を表す
  • func_parametersは関数のパラメータリスト、パラメータリストの形式は:[IN|OUT|INOUT]param_name type
  • IN:入力パラメータ
  • を示す
  • OUT:出力パラメータ
  • を示す
  • INOUT:入力も出力も可能であることを示す
  • .
  • param_name:パラメータを表す名前
  • type:パラメータのタイプを表します.このタイプはMySQLデータベースの任意のタイプ
  • です.
  • RETURNS type:文は関数がデータを返すタイプ
  • を表す.
  • characteristic:関数の特性を指定します.値はストレージ・プロシージャの定義と同じで、次のような値の取り方ができます.
  • LANGUAGE SQL:説明routine_body部分はSQL文で構成され、現在システムでサポートされている言語はSQLであり、SQLはLANGUAGE特性の唯一の値
  • である.
  • [NOT]DETERMINISTIC:ストレージ・プロシージャの実行結果が正しいかどうかを示します.DETERMINISTICは、結果が確定したことを示します.ストレージ・プロシージャを実行するたびに、同じ入力で同じ出力が得られます.一方、NOT DETERMINISTICは結果が不確定であることを示し、同じ入力で異なる出力が得られる可能性がある.いずれかの値が指定されていない場合、デフォルトはNOT DETERMINISTIC
  • です.
  • {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIESSQL DATA}:サブルーチンのSQL文使用制限を示す
  • CONTAINS SQLは、サブルーチンにSQL文が含まれていることを示しますが、読み書きデータが含まれていない文
  • NO SQLは、サブルーチンがSQL文を含まないことを示す
  • READS SQL DATA説明サブルーチンは、読み書きデータの文
  • を含む.
  • MODIFIESSQL DATAは、サブルーチンが書き込みデータを含む文
  • を示す
  • デフォルトでは、CONTAINS SQL
  • として指定されます.
  • SQL SECURITY{DEFINER|INVOKER}:誰が実行する権限を持っているかを示します.DEFINERは、ストアド・プロシージャを定義する者のみが実行できることを示す.INVOKERは、権限を持つ呼び出し元が実行できることを示します.デフォルトでは、システムはDEFINER
  • として指定されています.
  • COMMENT'string':ストレージ・プロシージャまたは関数
  • を記述するために使用できるコメント情報
  • routine_bodyはSQLコードの内容で、BEGINを使うことができます...ENDはSQLコードの開始と終了を表す
  • 一括追加データを実装するfunctionプロセスは、次のとおりです.
    まず、サーバ・データベースというテーブルのテーブル構造をローカルにコピーし、書かれたfunctionが正しいかどうかをローカルでデバッグしやすいようにしました.このテーブル構造は、挿入する必要があるデータに関連するフィールドが3つあります.
    ybxtm, dept_id, box_size //dept_id         
    

    次に、functionインプリメンテーションおよび呼び出しをインプリメンテーションします.
    DELIMITER $$ /*     ,   Linux     function              */
    CREATE FUNCTION addData(deptId INT, boxSize DOUBLE, ybxtm VARCHAR(20), amount INT)
      RETURNS INT DETERMINISTIC /*       ,   Linux              function characteristic*/
      BEGIN
        DECLARE i INT DEFAULT 1;
        DECLARE result INT DEFAULT 1;
        DECLARE sampleBoxNum VARCHAR(20) DEFAULT '';
        myloop: LOOP
          SET sampleBoxNum = ybxtm;
          IF i > amount
          THEN LEAVE myloop;
          END IF;
          IF i < 10
          THEN SET sampleBoxNum = concat(sampleBoxNum, concat('0', i));
          ELSE
            SET sampleBoxNum = concat(sampleBoxNum, i);
          END IF;
          INSERT INTO lx_ybx (ybxtm, dept_id, box_size) VALUES (sampleBoxNum, deptId, boxSize);
          SET result = result + 1;
          SET i = i + 1;
        END LOOP myloop;
        RETURN result - 1;
      END $$ /*          ,  Linux  ,function    */
     
    /*  function*/  
    SELECT addData(29, 20, 'X025714', 78);