2017-11-13 32 views
0

私は請求書の下に製品のリストを持つjsonオブジェクトを持っています。私はjsonからデータを読み込んでそれを1つずつ反復し、同じデータを製品テーブルと請求テーブルに挿入するmysql関数を記述したいと思います。ここでmysql関数のループスルーJSONオブジェクト

は私のJSONオブジェクトは、私は私が得るこれらの行と今JSON

CREATE DEFINER=`mydb`@`%` FUNCTION `raiseOrder`(dataObject Json) 
    RETURNS bigint(11) 
    BEGIN 
     DECLARE billNo BIGINT(11) DEFAULT NULL; 
     DECLARE customerName VARCHAR(64); 
     DECLARE date datetime DEFAULT NOW(); 
     DECLARE total Float(12,2); 
     DECLARE taxamt Float(12,2); 
     DECLARE fixedCharges Float(12,2); 

     DECLARE products json; 
     DECLARE productId bigint(15) DEFAULT NULL; 
     DECLARE categoryId bigint(11); 
     DECLARE cost float; 
     DECLARE categoryName varchar(64); 
     DECLARE quantity int default 0; 
     DECLARE supplierId bigint(11); 
     DECLARE supplierName varchar(128); 


     SET billNo = (SELECT JSON_EXTRACT(dataObject, "$.billNo")); 
     SET customerName = (SELECT JSON_EXTRACT(dataObject, "$.customerName")); 
     SET products = (SELECT JSON_EXTRACT(dataObject, "$.products"));   
     SET productId = (SELECT JSON_EXTRACT(products, "$[0].productId"));  
    RETURN 1; 
    END 

SET products = (SELECT JSON_EXTRACT(dataObject, "$.products"));   
    SET productId = (SELECT JSON_EXTRACT(products, "$[0].productId"));  

からデータを読み込み、MySQLの機能を持っている。ここ

{"billNo":16,"date":"2017-13-11 09:05:01","customerName":"Vikas","total":350.0,"fixedCharges":100,"taxAmount":25.78,"status":paid,"product":[{"productId":"MRR11","categoryId":72,"categoryName":"Parker Pen","cost":200,"quantity":2,"log":{"supplierId":"725","supplierName":"Rihant General Stores"}},{"productId":"MRR12","categoryId":56,"categoryName":"Drawing Books","cost":150,"quantity":3,"log":{"supplierId":"725","supplierName":"Rihant General Stores"}}]} 

です内製品jsonと0番目の製品のIDです。しかし、私は製品の配列を反復する方法が欲しい。

あなたがこれを達成するためにJSON_LENGTHと連動してWHILEループを使用することができます
+0

正直言って、MySQLの機能ではこれをしません。私はそれを行うためのスクリプトをPythonやRubyで書いています。 MySQLストアドルーチン以外の言語は、JSONを処理するより便利な方法をサポートしています。 –

+0

しかし、これは私がMySQLで行う必要があります。 – annonymous

+0

現在、MySQLにはJSON処理のための機能が非常に限られているため、別の言語を使用することをお勧めしますが、実装できる最初の近似は[db-fiddle](https://www.db-fiddle.com/ f/7gDo2bNyaRZnmFiAsyQRnw/0)、必要に応じてスクリプトを調整します。 – wchiquito

答えて

1

DECLARE json, products, product VARCHAR(4000); 
DECLARE i INT DEFAULT 0; 
SELECT '{"billNo":16,"date":"2017-13-11 09:05:01","customerName":"Vikas","total":350.0,"fixedCharges":100,"taxAmount":25.78,"status":"paid","product":[{"productId":"MRR11","categoryId":72,"categoryName":"Parker Pen","cost":200,"quantity":2,"log":{"supplierId":"725","supplierName":"Rihant General Stores"}},{"productId":"MRR12","categoryId":56,"categoryName":"Drawing Books","cost":150,"quantity":3,"log":{"supplierId":"725","supplierName":"Rihant General Stores"}}]} 
' INTO json; 

SELECT json->"$.product" INTO products; 

WHILE i < JSON_LENGTH(products) DO 
    SELECT JSON_EXTRACT(products,CONCAT('$[',i,']')) INTO product; 
    SELECT product; 
    SELECT i + 1 INTO i; 
END WHILE; 

おそらく;-)

NOTEしかし単に 'SELECT製品' よりも行う必要があります:MySQLをJSON関数が5.7.8で追加されたので、まずMySQLバージョンを確認する必要があります。

関連する問題