Создание триггера для автоматического увеличения идентификатора по последовательности в JDBC - PullRequest
0 голосов
/ 25 декабря 2018

Я пишу методы через JDBC для создания таблицы и последовательности для вызова в триггере. Я хочу установить столбец идентификатора, который автоматически увеличивается перед каждой вставкой в ​​таблицу.Мне удалось создать как метод createTable, так и метод createSequence в DAO, но когда я запустил метод для создания триггера, я получил параметр java.sql.SQLException: Missing IN или OUT при index :: 1

public void createTrigger() {

    PreparedStatement ps;

    StringBuilder queryTrigger = new StringBuilder();

    queryTrigger.append("CREATE OR REPLACE TRIGGER ");
    queryTrigger.append(Tables.getInstance().getName() + "_INSERTED\n");
    queryTrigger.append("BEFORE INSERT ON " + Tabelle.getInstance().getName());
    queryTrigger.append("\nFOR EACH ROW\n");
    queryTrigger.append("BEGIN\n");
    queryTrigger.append("SELECT " + Tables.getInstance().getName() + "SEQ.NEXTVAL\n");
    queryTrigger.append("INTO :new.id\n");
    queryTrigger.append("FROM dual;\n ");
    queryTrigger.append("END;\n");
    queryTrigger.append("/\n");
    queryTrigger.append("ALTER TRIGGER " +Tabelle.getInstance().getName() + "_INSERTED ENABLE\n");
    queryTrigger.append("/\n");



    String stringQueryTrigger = queryTrigger.toString();

    Connection conn = JDBCUtility.openConnection();

    try {

        ps = (PreparedStatement) conn.prepareStatement(stringQueryTrigger);

        ps.executeUpdate();
        ps.close();


    } catch(SQLException e) {
        e.printStackTrace();
    }

    JDBCUtility.closeConnection(conn);} 

Здесь вместо этого создание таблицы действительно работает, даже если я не пишу классические строки с параметризованным "?"для readyStatement.setString (index, String)

public void createTable(Columns c) {    
    PreparedStatement ps;
    StringBuilder query = new StringBuilder();



    query.append("CREATE TABLE " + Tabelle.getInstance().getName() + "(");
    query.append(Columns.getInstance().getColumnName() + " ");
    query.append(Columns.getInstance().getDataType());

    if(Columns.getInstance().isNullOrNot() == true) {
        query.append(" NOT NULL");
    }
    else {
        query.append("");           
    }
    if(Columns.getInstance().isPrimaryKeyOrNot() == true) {
        query.append(" PRIMARY KEY)");
    }
    else {
        query.append(")");
    }
    String queryToString = query.toString();



    Connection conn = JDBCUtility.openConnection();



    try {
        ps = (PreparedStatement) conn.prepareStatement(queryToString);

        ps.executeUpdate();
        ps.close();


    } catch(SQLException e) {
        e.printStackTrace();
    }

    JDBCUtility.closeConnection(conn);
}   

// EDIT

оказывается, что достаточно заменить PreparedStatement простым оператором, чтобы избавиться от механизма индексов иполучить БД для принятия запроса

1 Ответ

0 голосов
/ 25 декабря 2018

Я бы предложил создать в oracle автоматическую инкрементную последовательность, которая может использоваться для всех идентификаторов, и просто добавить строку id.NextVal к строковому запросу

Что я имею в виду:

Rem в оракуле создает последовательность

CREATE SEQUENCE ID

 START BY 1

 INCREMENT 1

// в Java для выполнения запроса

String query = "INSERT INTO TABLE VALUES(ID.NEXTVAL);" ;

// остальной код

...