В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
В таблице нет такой вещи, как «последняя» строка, так как таблица Oracle не имеет понятия порядка.
Однако, предполагая, что вы хотите найти последний вставленный первичный ключ и , что этот первичный ключ является увеличивающимся числом, вы можете сделать что-то вроде этого:
select *
from ( select a.*, max(pk) over () as max_pk
from my_table a
)
where pk = max_pk
Если у вас есть дата создания каждой строки, это станет, если столбец named created
:
select *
from ( select a.*, max(created) over () as max_created
from my_table a
)
where created = max_created
В качестве альтернативы вы можете использовать агрегированный запрос, например:
select *
from my_table
where pk = ( select max(pk) from my_table )
Вот немного SQL Fiddle для продемонстрировать.
$sql = "INSERT INTO table_name( field1, field2 ) VALUES ('foo','bar')
RETURNING ID INTO :mylastid";
$stmt = oci_parse($db, $sql);
oci_bind_by_name($stmt, "mylastid", $last_id, 8, SQLT_INT);
oci_execute($stmt);
echo "last inserted id is:".$last_id;
Совет: вам нужно использовать имя столбца id в {your_id_col_name} ниже ...
"RETURNING {your_id_col_name} INTO :mylastid"
Последняя строка в соответствии со строгим полным порядком по составному ключу K (k1, ..., kn):
SELECT *
FROM TableX AS o
WHERE NOT EXISTS (
SELECT *
FROM TableX AS i
WHERE i.k1 > o.k1
OR (i.k1 = o.k1 AND i.k2 > o.k2)
...
OR (i.k1 = o.k1 AND i.k2 = o.k2 AND i.k3 = o.k3 AND ... AND i.kn > o.kn)
)
;
Учитывая частный случай, когда K является простым (т. е. не композитным) приведенное выше сокращено до:
SELECT *
FROM TableX AS o
WHERE NOT EXISTS (
SELECT *
FROM TableX AS i
WHERE i.k1 > o.k1
)
;
Обратите внимание, что для этого запроса, чтобы вернуть только одну строку, ключ должен заказывать без связей. Если ссылки разрешены, этот запрос вернет все строки, привязанные к наибольшему ключу.
SELECT * FROM (
SELECT * FROM table_name ORDER BY sortable_column DESC
) WHERE ROWNUM = 1;
rownum
применяется до и order by
, что означает, что он игнорирует сортировку, которую вы там делаете. [Д0] oracle.com/technetwork/issue-archive/2006/06-sep/…
– Alex Moore-Niemi
16 September 2015 в 19:25
insert into /*+ append */
с ORDER BY DESC
в столбце идентификатора первичного ключа. Когда я построил таблицу изначально, она поставила строки в правильном порядке с 1-75. Когда я запускаю этот запрос или выполняю select * from ( select a.*, max(pk) over () as max_pk from my_table a ) where pk = max_pk
, я получаю 9
. Если я делаю SELECT ID FROM MyTable WHERE ROWID IN (SELECT MAX(ROWID) FROM MyTable)
, я получаю правильный ID 75
.
– vapcguy
12 August 2016 в 14:44
9
. Вот что я имел в виду, когда сказал: Когда я запустил этот запрос или сделаю i> ... выше. Этот ссылался на выполнение вашего запроса, rtaft. Извините, если это неясно.
– vapcguy
12 August 2016 в 20:37
MY_ID
в столбце с числовым типом данных @vapcguy, двоичная сортировка по строкам будет объяснять поведение, которое вы видите. Если нет, то, вероятно, лучше задать новый вопрос с помощью [mvce]. Пинг меня, если да, мне было бы интересно узнать, в чем проблема. Если вы только когда-либо вставляете прямые вставки в нераспределенную таблицу кучи, которую вы никогда не изменяете каким-либо образом (включая стандартный администратор) и где у вас есть только один файл данных с свободным пространством и никогда не выполняете какую-либо другую операцию, возможно i>, что ряды будут находиться в «восходящем» ... – Ben 13 August 2016 в 09:28