2013-12-15 47 views
0

我的目標是將數據導入德比數據庫。數據是以SQL轉儲的形式從MySQL實例中提取的,並且我關注了一個腳本,我只使用insert語句,並且轉義MySQL特定語法的轉義正確轉換爲Derby。 爲了測試,我使用了derby-maven-plugin:德比SQL腳本批量導入

export MAVEN_OPTS = -Xmx2048m; MVN德比:運行

在第一步中,我創建Derby實例的模式(使用DDLUtils從MySQL,這工作正常)。 其次,我嘗試導入數據。我IJ使用具有下述(shortend)腳本的命令行上:

CONNECT 'jdbc:derby://localhost:1527/foodmart'; 
SET SCHEMA APP; 
autocommit off; 
INSERT INTO "ACCOUNT" VALUES (1000,NULL,'Assets','Asset','~',NULL),       (2000,NULL,'Liabilities','Liability','~',NULL),(3000,5000,'Net Sales','Income','+',NULL),(3100,3000,'Gross Sales','Income','+','LookUpCube(\"[Sales]\",\"(Measures.[Store Sales],\"+time.currentmember.UniqueName+\",\"+ Store.currentmember.UniqueName+\")\")'),(3200,3000,'Cost of Goods Sold','Income','-',NULL),(4000,5000,'Total Expense','Expense','-',NULL),(4100,4000,'General & Administration','Expense','+',NULL),(4200,4000,'Information Systems','Expense','+',NULL),(4300,4000,'Marketing','Expense','+',NULL),(4400,4000,'Lease','Expense','+',NULL),(5000,NULL,'Net Income','Income','+',NULL); 
... 
commit; 

正如你可以看到,對於表的每一行有含有樣品數據的支架。 其他表格當然還有其他幾個插入語句。正確地完成一些插入件後,將本體的進口過程扼流圈在一個非常大的數據集(> 1000行)由於以下異常(從德比-原木):

java.lang.StackOverflowError 
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source) 
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source) 
... and many lines more repeatingly because of the recursive nature... 
Cleanup action completed 

在命令行上IJ打印:

FEHLER XJ001: DERBY SQL error: SQLCODE: -1, SQLSTATE: XJ001, SQLERRMC: java.lang.StackOverflowError^T^TXJ001.U 

就是這個意思,用SQL的大容量導入方案是德比不能夠? 我應該改用基於CSV的導入嗎? 我從stacktrace方法調用中假定德比不能創建查詢計劃。 對於插入語句的每個「數據括號」,它是否可能會創建一個UNION語句,從而爲每個INSERT查詢添加大量的開銷。 所以我應該嘗試在許多簡潔的語句中分割我的長INSERT語句? 我沒有時間看德比的來源,所以請幫助我!

+0

當您導入1000行時,您是否發出1000個單獨的INSERT語句?或者,您是否在VALUES子句中發佈1000個項目的IMPORT語句? –

+0

對於1000行,我發出一個導入語句,但是我沒有1000個不同的列。您可以在VALUES子句中添加多個值,並使用逗號分隔它們。 – user2078148

+0

是的,這種技術肯定會對語句複雜性產生限制。正如你在答案中所描述的那樣使用單獨的IMPORT語句,或者使用系統過程來導入批量數據,這是一條路。 –

回答

0

我只是使用了許多import語句和它的工作。

看來,INSERT語句的每一個數據支架德比由於許多遞歸方法調用生成棧上的方法調用,leeding許多括號的計算器。

但是你只需要從

INSERT INTO VALUES(1,2,3)轉換的INSERT語句,......,(4,5,6);

要多個語句:

INSERT INTO VALUES(1,2,3); ... 插入INTO VALUES(4,5,6);