Подтвердить что ты не робот

Sybase Adaptive Server IQ не может SELECT *, всегда ограничен 30?

У меня эта проблема с базой данных Sybase IQ (версия SELECT @@version показывает Adaptive Server IQ/12.5.0/0306) с использованием расширения PHP SQL Anywhere.

Я не могу выбрать все строки, т.е. SELECT * from anytable всегда возвращает 30 строк.

Единственным обходным решением, которое я нашел, является использование SELECT TOP 1000 * from anytable (максимум 32767), но есть определенные ситуации, когда мне нужны все строки.

Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: пример script (как документация )

$conn = sasql_connect("HOST=host:port;DBN=dbn;UID=uid;PWD=pwd");
if (!$conn) { echo "Connection failed."; die(); }

$result = sasql_query($conn, "SELECT * FROM dba.anytable" );
sasql_result_all($result); // display 30 rows in a formatted table
sasql_free_result($result);
sasql_disconnect($conn);

EDIT: спецификации обеих машин, где я испытываю ту же самую проблему:

Машина разработки:

Производственный сегмент:

4b9b3361

Ответ 1

Наверное, глупый вопрос, но, чтобы быть уверенным.

Вы проверили Client → Tools → Sybase IQ → Максимальное количество строк для отображения.

(sry для публикации этого ответа, но у меня нет достаточного количества отзывов, чтобы спросить вас в комментариях.) Cheers

Ответ 2

Ну, возможно, есть кое-что конфигурируемое свойство, которое освободит вас от злых кладок 30. Я не знаю, где это свойство. Я надеюсь, что кто-то найдет это.

В случае, если никто этого не делает, вот большой взлом, который заказывает первичный ключ данной таблицы, извлекает столько строк, сколько может дать ваши ограничения, и отслеживает последний выбранный первичный ключ для извлечения следующая партия строк. Было бы лучше адаптировать это, чтобы использовать START AT или LIMIT/OFFSET, если они доступны, но я предполагаю, что это не так. Если один из них доступен, вы можете использовать этот подход для любой таблицы. Если нет, этот подход может быть адаптирован к любой таблице, которая имеет уникальный ненулевой ключ.

$conn = sasql_connect("HOST=host:port;DBN=dbn;UID=uid;PWD=pwd");
if (!$conn) {echo "Connection failed."; die(); }

$highest_id = -1;
$num_rows_retrieved = 0;

do {
  if (!sasql_real_query($conn, "SELECT TOP 32767 * FROM dba.anytable where anytable_id > $highest_id order by anytable_id")) {
    echo "Query failed.";
    die();
  }
  $result = sasql_use_result($conn);
  if (!$result) {
    echo "No result set.";
    die();
  }
  $num_rows_retrieved = 0;
  $num_fields = sasql_num_fields($result);
  while ($row = sasql_fetch_row($result)) {
    $highest_id = $row[0];  // assumes anytable_id is the first field
    $i = 0;
    while ($i < $num_fields) {
      echo "$row[$i]\t"; 
      $i++;
    }
    $num_rows_retrieved++;
    echo "\n";
  }
  sasql_free_result($result);
} while ($num_rows_retrieved == 32767);

sasql_disconnect($conn);