выбор записи из oracle

#php #sql #oracle

#php #sql #Oracle

Вопрос:

Чтобы выбрать последнюю запись, я использовал это, когда моей базой данных был MySQL:

 $result = mysql_query("SELECT Id 
                         FROM test 
                     ORDER BY LENGTH(Id), Id ASC");

$count = mysql_numrows($result);

if($count != 0) {    
  $lastid = mysql_result($result,$count-1,"Id");    
}
  

… и это работает нормально.
Но теперь моя таблица находится в базе данных Oracle — я написал:

 $stid = oci_parse($conn, "SELECT Id 
                            FROM test 
                        ORDER BY LENGTH(Id), Id ASC");

oci_execute($stid);

$p = oci_parse($conn, "SELECT COUNT(ID) 
                         FROM test");

oci_execute($p);

$count = oci_fetch_array($p);

if($count[0] != 0) {    
  $lastid = oci_result($stid, $count[0]-1);
}
  

Это не работает — я не получаю последнюю запись.

Комментарии:

1. Как вы определяете последнюю запись? Это последняя вставленная запись? Зачем вам это нужно?

2. когда в таблице ничего нет, я хочу вставить D1111, а затем, если я получу D1111, я вставлю D1112, а затем ….9,10,11.Используя код для mysql (верхняя часть), все просто отлично. но проблема в том, что база данных передается в oracle (2-я часть моего кода). и hypen на самом деле я использовал, чтобы показать вам префикс

Ответ №1:

И для чего вы это используете? Если это необходимо для определения следующего идентификатора, то не делайте этого, а используйте вместо этого последовательность. Если нет, то вы можете использовать select max(id) from testid для получения максимального значения столбца.

Редактировать

Сначала создайте последовательность для хранения порядкового номера :

 create sequence testid_seq;
  

Затем, когда вы вставляете запись, используйте

 insert into testid(id, ...) values ("D111-" || testid_seq.nextval, ... );
  

И просто заполните точки информацией, которую вы хотите вставить.

Комментарии:

1. столбец не имеет числового типа. Ее первый символ D. И мне нужна последовательность D111-1 D111-2 D111-3.max (id) не будет работать

2. Вы должны упомянуть об этом в своем вопросе.

3. Но используете ли вы его для определения следующего идентификатора при вставке новых записей? Если это так, вы все равно можете использовать последовательность, в которой просто хранится последнее число вашего идентификатора, а затем вставить это значение с префиксом D111- в столбец вашего идентификатора.

4. Я только что отредактировал свой ответ, чтобы детализировать его немного больше, этот подход, вероятно, должен сработать (хотя прошло некоторое время с тех пор, как я в последний раз использовал Oracle: p).

5. Хотя я согласен, что есть лучшие способы настройки этого, подобные изменения не являются тривиальными. Нам легко сказать «измените вашу модель данных», но нам не нужно выполнять всю работу — это очень неразумно, учитывая, что люди, задающие эти вопросы, могут иметь дело со 100 K записями.

Ответ №2:

Если вы прочитаете документацию для oci_result, вы обнаружите, что неправильно используете второй параметр.

Второй параметр — это то, что вы используете для извлечения столбца — это может быть имя столбца или порядковое значение. Порядковое значение — это число, начинающееся с единицы (1) на основе столбцов, указанных в предложении SELECT. Порядковые номера не являются рекомендуемой практикой, потому что, если запрос изменится — если вы забудете обновить порядковую ссылку, ваш поиск значений будет испорчен. Фактически, последующий запрос COUNT возвращает значение, превышающее количество столбцов в предложении первого запроса SELECT.

 $stid = oci_parse($conn, "SELECT Id 
                            FROM test 
                        ORDER BY LENGTH(Id), Id ASC");

oci_execute($stid);

$lastid = oci_result($stid, 1);
  

oci_result отсутствует третий параметр, который mysql_result предоставляет.

Чтобы все заработало в Oracle, используйте:

 $stid = oci_parse($conn, "SELECT x.id
                            FROM (SELECT Id 
                                    FROM test 
                                ORDER BY LENGTH(Id) DESC, Id DESC) x
                           WHERE ROWNUM = 1");

oci_execute($stid);

$lastid = oci_result($stid, 1);
  

Обновленный запрос вернет одну строку, самую последнюю, основанную на изменении ORDER BY того, что вы использовали ранее.

Комментарии:

1. @Rasel: Запустите SQL-запрос непосредственно к Oracle в любом имеющемся у вас клиенте — SQLPlus, Toad, PLSQLDeveloper. Второй пример вернет только одно значение…

2. О, ваш запрос просто отменяет мой запрос. Итак, то, что мне нужно, теперь находится в первой строке. Я собираюсь принять ваш ответ. Спасибо