Фиксация Firebird не работает в приложении Java

Я использую процедуру для вставки данных в мою базу данных firebird. Эта процедура вызывается в команде while, потому что нет ограничений на количество элементов, которые я могу вставить, например:

while (there's itens) {
    query("select * from procedure_insert(id,desc,etc);");
}

Это не работает, после того, как я закончу вставку, ни один элемент не будет вставлен в базу данных. Моя процедура работает нормально, нет никаких сомнений, я считаю, что это проблема с классом, который я использую для запроса и фиксации.

Вот мой код:

Класс стойкости:

public class Persistence {

    public static Connection con = Conn.getConn();
    public static Statement stm  = null;

    public static void Conn(){
        try {
            stm  = con.createStatement();
        } catch (SQLException e) {
            //
        }
    }

    public static void Insert(String query) {

        try {
            stm.execute(query);
        } catch (SQLException e) {
            //
        } 
    }

    public static void Commit(){
        try {
            con.commit();
    } catch (SQLException e) {
        //
    }
}

Вставлять:

while(rs.next()){

    Items item = new Items();
    item.setItem_data(rs.getString("ZPED_ITEM_DATA"));
    item.setItem_desconto(rs.getDouble("ZPED_ITEM_VALOR_V") - rs.getDouble("ZPED_ITEM_DESCONTO"));
    item.setItem_produto(rs.getInt("ZPED_ITEM_PRODUTO"));
    item.setItem_qtd(rs.getDouble("ZPED_ITEM_QTD"));
    item.setItem_valor_v(rs.getDouble("ZPED_ITEM_VALOR_V"));
    item.setPed_cod(rs.getInt("ZPED_COD"));
    ////////////////////////////////////////////////////////////////
    Persistence.Insert("SELECT * FROM PEDIDOS_PROC("+a+","+b+","+p.get(0).getCod_n()+",'"+p.get(0).getData()+"',55,"+item.getItem_produto()+",0,"+item.getItem_qtd()+","+item.getItem_valor_v()+",'A',2);");
    Persistence.Commit();
}

спасибо!

Я использую JDBC Jaybird Full 2.2.7.


person Matheus Hernandes    schedule 06.05.2015    source источник
comment
вы действительно ловите и игнорируете все эти SQLExceptions? Не делай этого. По крайней мере, распечатайте несколько сообщений об ошибках.   -  person Thilo    schedule 06.05.2015
comment
Покажите, пожалуйста, код функции PEDIDOS_PROC? Что оно делает? И почему вы используете функцию для вставки данных? Разве это не должна быть хранимая процедура?   -  person a_horse_with_no_name    schedule 06.05.2015
comment
PEDIDOS_PROC - это огромная хранимая процедура, созданная другим человеком, эта процедура в порядке, если я запрашиваю ее на терминале, она работает нормально, и при запуске моего приложения не возникает ни одной ошибки. Просто не работает, как будто я забыл зафиксировать, чего я не...   -  person Matheus Hernandes    schedule 06.05.2015
comment
Вы проглатываете исключения в своем классе Persistence, поэтому, насколько вам известно, вы получаете много исключений. Вам также нужно показать, как вы создаете свое соединение. Кроме того, способ объединения запросов открыт для SQL-инъекций. Вы действительно должны использовать PreparedStatement для этого (и это также может быть причиной ваших текущих проблем).   -  person Mark Rotteveel    schedule 06.05.2015
comment
И, наконец, ваше утверждение заканчивается точкой с запятой, которая на самом деле не является частью грамматики SQL Firebirds (и я постоянно забываю, удаляет ли Jaybird их или нет); наличие точки с запятой может вызвать синтаксическую ошибку.   -  person Mark Rotteveel    schedule 06.05.2015
comment
если я запрошу ее на терминале, все будет работать нормально - так как именно вы вызываете эту процедуру в терминале? Отличается ли этот оператор от того, который вы используете в коде Java?   -  person a_horse_with_no_name    schedule 06.05.2015
comment
Я распечатал оператор и вставил в терминал точно такой же запрос, выполненный в приложении Java. Я меняю select * from на выполнить процедуру и начинаю работать   -  person Matheus Hernandes    schedule 06.05.2015


Ответы (1)


можно ли выбрать процедуру PEDIDOS_PROC? Если нет, вы должны выполнить его

execute procedure PEDIDOS_PROC(params...)
person rstrelba    schedule 06.05.2015
comment
Я не совсем уверен, но я считаю, что причина, по которой это работает, заключается в том, что IIRC, если вы выбираете из хранимой процедуры (которая, кстати, также работает для исполняемых хранимых процедур), тогда изменения, сделанные в хранимой процедуре, откатываются, если эта строка не получен клиентом; и вы никогда не обрабатываете набор результатов, поэтому строки не обрабатываются. Если вы выполняете хранимую процедуру, она может создать одну строку, и эта одна строка будет возвращена немедленно при выполнении. Это то, что я собираюсь проверить и задокументировать. - person Mark Rotteveel; 06.05.2015
comment
Не знаю, почему ... но теперь работает, и я знаю, что select * from обычно выполняет хранимые процедуры, потому что это работает, если я запускаю на терминале. - person Matheus Hernandes; 06.05.2015
comment
@acca90 большая разница в том, что isql сразу извлекает все строки, а jaybird этого не делает. - person Mark Rotteveel; 06.05.2015
comment
Потенциально связанный вопрос: stackoverflow.com/questions/18046737/ - person Mark Rotteveel; 27.05.2015