Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Насколько я могу вспомнить со своих дней Oracle, Вы не можете достигнуть Столбцов автоприращения, не используя ТРИГГЕР. Любые решения там для создания столбца автоприращения включают ТРИГГЕР и ПОСЛЕДОВАТЕЛЬНОСТЬ (я предполагаю, что Вы уже знаете это, следовательно никакие триггерные комментарии).
Если Вам не нужны порядковые номера, но только уникальный идентификатор, можно использовать ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ SYS_GUID (). Т.е.:
CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
Можно создать и использовать последовательности оракула. Синтаксис и детали в , http://www.techonthenet.com/oracle/sequences.php
Также читает статью http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html для понимания ограничений относительно АВТОМАТИЧЕСКОГО НОМЕРА в другом RDBMS
Триггер для получения следующего значения из последовательности является наиболее распространенным способом достигнуть эквивалента АВТОИНКРЕМЕНТУ:
create trigger mytable_trg
before insert on mytable
for each row
when (new.id is null)
begin
select myseq.nextval into :new.id from dual;
end;
Вам не нужен триггер при управлении вставками - просто используют последовательность в операторе вставки:
insert into mytable (id, data) values (myseq.nextval, 'x');
Это могло быть скрыто в пакете API, так, чтобы вызывающая сторона не должна была ссылаться на последовательность:
mytable_pkg.insert_row (p_data => 'x');
, Но использование триггера более "прозрачно".
Создайте последовательность:
create sequence seq;
Затем для добавления значения
insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');
Примечание: Ищите документы оракула для большего количества опций о последовательностях (запустите значение, инкремент...)
Помимо, например, Ответ FerranB:
Вероятно, стоит упомянуть, что, в отличие от того, как auto_incement работает в MySQL:
Если вы не хотите использовать "триггерное" решение, вы можете добиться функциональности автоинкремента программным способом, получив значение клавиши автоинкремента с помощью метода getGeneratedKeys()
.
Вот фрагмент кода для вашего рассмотрения:
Statement stmt = null;
ResultSet rs = null;
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTable");
stmt.executeUpdate("CREATE TABLE autoIncTable ("
+ "priKey INT NOT NULL AUTO_INCREMENT, "
+ "dataField VARCHAR(64), PRIMARY KEY (priKey))");
stmt.executeUpdate("INSERT INTO autoIncTable (dataField) "
+ "values ('data field value')",
Statement.RETURN_GENERATED_KEYS);
int autoIncKeyFromApi = -1;
rs = stmt.getGeneratedKeys();
if (rs.next()) {
autoIncKeyFromApi = rs.getInt(1);
}
else {
// do stuff here
}
rs.close();
источник: http://forums.oracle.com/forums/thread.jspa?messageID=3368856