繁体   English   中英

首次运行软件时如何从Java代码创建MySQL过程(设置数据库过程)

[英]How to create MySQL Procedures from java code when software runs for first time (Setting up database procedures))

我想在我的应用程序首次在新设备上运行时设置数据库。 为此,我必须创建必要的表,存储过程等。我在应用程序的初始启动时成功创建了表。 但是我无法对过程实施相同的操作。

我尝试在第一次启动应用程序时执行存储过程查询。 尽管创建过程的MySQL代码是正确的,但是Java给出了错误提示
java.sql.BatchUpdateException:您的SQL语法有错误; 检查与您的MySQL服务器版本相对应的手册,以在第1行的'DELIMITER // CREATE PROCEDURE update_registered_fields(IN _field VARCHAR(200))'附近使用正确的语法

我没有在这里显示与数据库的连接,因为它工作正常。 我已经使用了procedures.xml文件来获取代码查询。

数据库处理程序

private static void inflateProcedure() throws SQLException, FileNotFoundException, ParserConfigurationException, SAXException, IOException{
    Set<String> set = new HashSet<>();
    List<String> procedureData = new ArrayList<>();
    String query = "SHOW PROCEDURE STATUS WHERE Db = '"+Preferences.getPreferences().getDatabaseName()+"';";
    System.out.println(query);
    stmnt = con.createStatement();
    ResultSet rs = stmnt.executeQuery(query);
    while(rs.next()){
        set.add(rs.getString("NAME").toLowerCase());
    }
    System.out.println("Already Loaded Procedures "+set);
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(new FileInputStream(Preferences.getPreferences().getLocation()+"procedures.xml"));
    NodeList nList = doc.getElementsByTagName("table-entry");
    for (int i = 0; i < nList.getLength(); i++) {
        Node nNode = nList.item(i);
        Element entry = (Element) nNode;
        String procedureName = entry.getAttribute("name");
        String params = entry.getAttribute("params");
        String procedureQuery = entry.getAttribute("data");
        if (!set.contains(procedureName.toLowerCase())) {
            procedureData.add(String.format("DELIMITER // CREATE PROCEDURE %s %s \n"
                    + "BEGIN;\n"
                    + " %s \n"
                    + "END //\n DELIMITER ", procedureName, params, procedureQuery));
        }
    }
    if (procedureData.isEmpty()) {
        System.out.println("Procedures are already loaded");
    }
    else {
        System.out.println("Inflating new Procedures.");
        createProcedures(procedureData);
    }
}

private static void createProcedures(List<String> procedureData) throws SQLException{
    Statement statement = con.createStatement();
    for (String command : procedureData) {
        System.out.println(command);
        statement.addBatch(command);
    }
    statement.executeBatch();
    statement.close();
}

Procedures.xml

<procedures>
<table-entry name="update_registered_fields" params="(IN _field VARCHAR(200))" data="DECLARE _value INT DEFAULT 0;

    SET _value := (SELECT `user_register_feilds`.`last_used` FROM `user_register_feilds` WHERE `user_register_feilds`.`name` = _field);
    UPDATE `user_register_feilds` SET `user_register_feilds`.`last_used` = _value+1 WHERE `user_register_feilds`.`name` = _field;"/>

<table-entry name="sort_fields" params="(IN _value INT(50))" data="SELECT * FROM user_enquiry ORDER BY last_used DESC, id ASC LIMIT _value;"/>

我要执行此查询。 我什至尝试过allowMultiQueries 我还想知道,这是我们首次启动应用程序时填充数据库的正确方法。

您似乎在sql查询中使用了定界符,试图在JDBC中运行,这从错误消息中可以明显看出: java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE update_registered_fields (IN _field VARCHAR(200))' at line 1 java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE update_registered_fields (IN _field VARCHAR(200))' at line 1

尝试删除定界符。 在原始sql中使用定界符。 JDBC不需要定界符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM