Как получить самую последнюю строку в операторе select в Oracle Apex 5?

Когда пользователь заполняет форму, столбец выбирает самые последние данные из определенных столбцов и объединяет столбцы в новый столбец (идентификатор записи). Теперь у меня выбраны правильные столбцы, но проблема заключается в том, что для каждой заполненной формы код получает строку только из самой первой записи, которая когда-либо была заполнена. По-видимому, TOP и LIMIT не работают в Oracle Apex 5, и кажется, что проблема здесь именно в ROWNUM = 1.

DECLARE
  IDENTITY VARCHAR2(40);
BEGIN
  SELECT CONCAT(COL1, CONCAT('-', CONCAT(COL2, COL3)))
 INTO IDENTITY FROM TABLE
 WHERE ROWNUM = 1;
 RETURN IDENTITY; 
END;

person thelamp    schedule 30.03.2017    source источник
comment
где rownum = 1 использует псевдостолбец rownum для возврата только первой строки результирующего набора. он делает именно то, для чего он закодирован. Что вы хотите вернуть из запроса, вы указали, что он делает, но не то, что вы хотите?   -  person unleashed    schedule 30.03.2017
comment
Также для удобочитаемости рассмотрите оператор конкатенации для удобочитаемости. ВЫБЕРИТЕ столбец 1 || '-' || столбец2 || столбец3 ...   -  person unleashed    schedule 30.03.2017
comment
Трубы (||) не работают, так что я должен сделать это таким образом.   -  person thelamp    schedule 30.03.2017
comment
Я хочу, чтобы он получил самую последнюю строку, а не просто получил первую строку, которая есть.   -  person thelamp    schedule 30.03.2017
comment
Трубы не работают. Тогда вы делаете это неправильно. Почему они у вас не работают?   -  person unleashed    schedule 30.03.2017
comment
Нет, сейчас работают. Спасибо.   -  person thelamp    schedule 30.03.2017


Ответы (1)


Вы не указали версию оракула. До 12c вы должны сначала отсортировать результат, а затем вернуть первую строку. Это называется запросом Top-N. Вам необходимо предоставить столбец поиска в запросах ниже.

DECLARE
  IDENTITY VARCHAR2(40);
BEGIN
 SELECT NEW_ID
 INTO IDENTITY
 FROM (SELECT COL1 || '-' || COL2 || COL3 as NEW_ID
       FROM TABLE
       ORDER BY <sort column> )
 WHERE ROWNUM = 1;
 RETURN IDENTITY; 
END;

Если вы используете 12c, вы можете использовать ТОЛЬКО FETCH FIRST ROW

DECLARE
  IDENTITY VARCHAR2(40);
BEGIN
 SELECT COL1 || '-' || COL2 || COL3
 INTO IDENTITY
 FROM TABLE
 ORDER BY <sort column>
 FETCH FIRST ROW ONLY;
 RETURN IDENTITY; 
END;
person unleashed    schedule 30.03.2017
comment
Дело в том, что теперь я получаю самую последнюю строку, так что это работает, но теперь, когда я проверяю записи, все их идентификаторы идентичны для каждого, и они меняются по мере добавления новой записи. Итак, предположим, что есть пять записей (A, B, C, D, E), идентификация всех из них будет E-E5. И если я добавлю новую запись, то все записи будут иметь одинаковую идентичность: F-F6. - person thelamp; 30.03.2017
comment
Однако я хочу, чтобы запись A имела идентификатор A-A1, запись B была бы B-B2, запись C была бы C-C2, запись D была бы D-D4 и так далее. - person thelamp; 30.03.2017
comment
Кстати, я использую rownum (ваше первое предложение) - person thelamp; 30.03.2017
comment
вам нужна либо последовательность на вашем столе, чтобы помочь определить хронологию, либо дата. - person Scott; 31.03.2017
comment
@ruchithelamp похоже, у вас другая проблема с логикой обновления. Исходя из того, что вы сказали, может показаться, что вы обновляете все строки, а не только целевую строку, используя соответствующее предложение where в своем операторе обновления. - person unleashed; 31.03.2017