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_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つあります.
次に、functionインプリメンテーションおよび呼び出しをインプリメンテーションします.
ちゅうしん
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
まず、サーバ・データベースというテーブルのテーブル構造をローカルにコピーし、書かれた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);