Как определить что результат Select'a не выдал ни одиной строки?

  • Автор темы Автор темы motl
  • Дата начала Дата начала

motl

Новичок
Как определить что результат Select'a не выдал ни одиной строки?

Задача.

Делаем запрос в базу, если он возвращает список значений, то выводим их, а если нет то делаем то-то и то-то.
С двумя одинаковыми запросами понятно как сделать, а как сделать все одним?

Пытался вот так, но засада в том, что первый OCI_Fetch($s) сбивает курсор во внутреннем буфере, и если запись по запросу одна, то она не выводится.

PHP:
$c=OCI_Connect("InventoryList", "12345678", "XE");

if (!$c) {
  $err = OCI_close();
  echo "Oracle Connect Error " . $err[text];
}

$s = OCI_Parse($c, "select * from InventoryList where PARTNO='TZ678769T'");
  
  
  OCI_Execute($s,OCI_DEFAULT);
  If(OCI_Fetch($s)) {echo "!";} // Первый
  while (OCI_Fetch($s)) { // Второй
    echo "PARTNO=" . ociresult($s,'PARTNO').", LOC=" . ociresult($s,'LOC').", PARTNAME=".ociresult($s,'PARTNAME') . "<br>";
  }
 
o_O, так чтоли?
PHP:
$found = false;
while (fetch(...)) {
  $found = true;
  echo "alabala"
}
if (!$found)
  echo "OMG, not found"
 
dr-sm
Спасибо. до флага я что-то не додумался, поздно вчера было :-).
 
А не проще пофетчить все в массив:
oci_fetch_all

и при необходимости проверить его на пустоту?
 
Автор оригинала: Falc
А не проще пофетчить все в массив:
oci_fetch_all

и при необходимости проверить его на пустоту?
Да можно и так, но с точки потребления ресурсов первый вариант более оправданный, ведь массив - это память.
 
Зачем тут Оракл юзается, вообще непонятно :)
Была бы нормальная логика на сервере, весь вопрос решился бы вызовом одной процедурки.

Да можно и так, но с точки потребления ресурсов первый вариант более оправданный, ведь массив - это память.
еще один великий оптимизатор.
 
Автор оригинала: motl
Да можно и так, но с точки потребления ресурсов первый вариант более оправданный, ведь массив - это память.
С массивом проще работать, при необходимости всегда можно узнать кол-во полученных строк. Так же всю логику по работе с базой можно убрать в отдельный слой.
 
Автор оригинала: Adelf
Зачем тут Оракл юзается, вообще непонятно :)

Была бы нормальная логика на сервере, весь вопрос решился бы вызовом одной процедурки.
еще один великий оптимизатор.
Очень впечатлили комменты, вот только по делу ничего не сказано.
Оптимизаций надо заниматься сразу, либо никогда.

If(OCI_Fetch($s)) {echo "!";
//while
} // Первый
else
{
echo "OMG, not found";
}
В том то и дело, что в while тоже надо будет проверять (OCI_Fetch($s)), а буфер будет сдвинут первой проверкой.
Чтобы это понять надо сделать запрос, который выводит только одну строку.
 
Очень впечатлили комменты, вот только по делу ничего не сказано.
Оптимизаций надо заниматься сразу, либо никогда.
Комменты действительно не по делу. Но ты можешь считать это бесплатными советами.
Оракл тобою используется так, как будто это MySQL версии 4.х Не знаю что заставило вас(или тебя если это решал ты) выбрать именно Оракл.
Про отдельный слой работы с базой тебе уже тут сказали.
Про оптимизацию - вообще молчу :) Ты еще недостаточно опытен, чтобы рассуждать об этом.
 
Про oci_num_rows могу сказать, что работает она примерно так:

OCI_Execute
oci_num_rows // returns 0
OCi_Fetch
oci_num_rows // returns 1
OCi_Fetch
oci_num_rows // returns 2

Т.е. фактически бесполезна.
 
ну, значит, запускать ее надо после while :) хотя согласен, это идиотизм )
 
Если всем хочется знать, то на Оракле построена система управления складом, а боку для кпк с ви-фи рисуется веб интерфейс.


Про оптимизацию - вообще молчу Ты еще недостаточно опытен, чтобы рассуждать об этом.
Да ладно, скажи, как более опытный, неужели, использование массива для всей выборки менее затратней в плане ресурсов чем один флаг из первого примера?

Ну не нужно мне знать какое количество у меня возвращает запрос, и не нужено пока работать с базой как с отдельным слоем.
Ещё доводы?!
 
система управления складом... максимум 10 юзеров?
Ну зачем тут нужно что-то оптимизировать?!
Пиши красивый код, не загружая мозг оптимизациями. У тебя есть такая возможность, а ты ею не пользуешься.

Ну и последнее слово об оптимизациях. Когда ты оптимизируешь что-то, то часто подбираешь щепки, а бревна не видишь.
Я вот готов поспорить, что звездочка между SELECT и FROM - это и есть то самое бревно тут(возможно не единственное), а всякие массивы там.. или флаги - это щепки.
 
Звездочка это просто в отладочном селекте, конечно все по полям будет выводится, по этому моменту я солидарен.
 
Сверху