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

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>";
  }
 

dr-sm

Новичок
:confused:, так чтоли?
PHP:
$found = false;
while (fetch(...)) {
  $found = true;
  echo "alabala"
}
if (!$found)
  echo "OMG, not found"
 

motl

Новичок
dr-sm
Спасибо. до флага я что-то не додумался, поздно вчера было :).
 

Falc

Новичок
А не проще пофетчить все в массив:
oci_fetch_all

и при необходимости проверить его на пустоту?
 

motl

Новичок
Автор оригинала: Falc
А не проще пофетчить все в массив:
oci_fetch_all

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

Adelf

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

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

Falc

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

motl

Новичок
Автор оригинала: Adelf
Зачем тут Оракл юзается, вообще непонятно :)

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

If(OCI_Fetch($s)) {echo "!";
//while
} // Первый
else
{
echo "OMG, not found";
}
В том то и дело, что в while тоже надо будет проверять (OCI_Fetch($s)), а буфер будет сдвинут первой проверкой.
Чтобы это понять надо сделать запрос, который выводит только одну строку.
 

Adelf

Administrator
Команда форума
Очень впечатлили комменты, вот только по делу ничего не сказано.
Оптимизаций надо заниматься сразу, либо никогда.
Комменты действительно не по делу. Но ты можешь считать это бесплатными советами.
Оракл тобою используется так, как будто это MySQL версии 4.х Не знаю что заставило вас(или тебя если это решал ты) выбрать именно Оракл.
Про отдельный слой работы с базой тебе уже тут сказали.
Про оптимизацию - вообще молчу :) Ты еще недостаточно опытен, чтобы рассуждать об этом.
 

Adelf

Administrator
Команда форума
Про oci_num_rows могу сказать, что работает она примерно так:

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

Т.е. фактически бесполезна.
 

Wicked

Новичок
ну, значит, запускать ее надо после while :) хотя согласен, это идиотизм )
 

motl

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


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

Ну не нужно мне знать какое количество у меня возвращает запрос, и не нужено пока работать с базой как с отдельным слоем.
Ещё доводы?!
 

Adelf

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

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

motl

Новичок
Звездочка это просто в отладочном селекте, конечно все по полям будет выводится, по этому моменту я солидарен.
 
Сверху