2013-03-13 30 views
0

问题:我在.SQL文件中有几百个sql插入语句,它将针对oracle数据库运行。我想检查插入语句是否正确形成,就像我想检测是否我错过了任何逗号等。只是我想确保语句将运行与任何错误。所以我想写一个小的Java应用程序来检查脚本运行之前是否有可能?检查SQL语句是否正确形成

示例查询:

INSERT INTO suppliers 
(supplier_id, supplier_name) 
VALUES 
(24553, 'IBM'); 

我想即使在DB运行前进行检查。让我们假设我没有访问任何数据库。

+2

该数据库应该已经告诉你,如果它没有正确形成。 – andre 2013-03-13 18:41:08

+0

检查[这个讨论](http://stackoverflow.com/questions/141499/any-java-libraries-out-there-that-validate-sql-syntax) – 2013-03-13 18:45:19

+0

@andre我想检查这甚至在运行之前D B 。让我们假设我没有访问任何数据库。 – Wills 2013-03-13 18:45:34

回答

0

您可以尝试使用'explain plan for'预处理每个SQL语句。如果SQL无效,解释将失败。

0

是的,这是可能的。

的伪代码可以

loop through lines 
{ 
Take the string between first '(' and ')' position; 
split the string into first array with separator ',' using split function. 

Take the string between second '(' and ')' position; 
split the string into second array with separator ',' using split function. 

compare the no of size for first and second array. 
if they are not equal 
print the statement for correction; 
} 

希望这有助于你

0

我从来没有在甲骨文之前,所以我不知道是否有某种对照/测试模式下可以工作的启用。

如果您只想检查类似拼写错误的东西,那么我会将所有表名替换为dual并运行插入。 这不会验证数据类型的列计数通过...

+0

如果这取决于我,我会写一个脚本或程序从csv文件中获取原始数据,并生成插入语句。 然后,您可以让您的代码在手之前验证每组数据,并且它应该每次都能正常工作,前提是您正确处理了引号/ dbl引号等内容。 这对于小数据集显然不切实际...... – NeilA 2013-03-13 18:55:20

0

如果你知道java,你可以使用这个正则表达式模式,但它不会拿起(或),我为我的生活不能弄清楚如何匹配一个括号。 这只适用于您的示例,并且您的整个插入需要位于同一行中,每行只有一个插入。

Pattern.compile("^\\s*INSERT\\s+INTO\\s+[a-zA-Z]\\w*\\s*.\\s*[a-zA-Z]\\w*\\s*,\\s*[a-zA-Z]\\w*\\s*.\\s*VALUES\\s*.\\s*\\d+\\s*,\\s*'\\w*\\'\\s*.\\s*;\\s*$");