#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. О, ваш запрос просто отменяет мой запрос. Итак, то, что мне нужно, теперь находится в первой строке. Я собираюсь принять ваш ответ. Спасибо