У меня есть эта проблема с базой данных Sybase IQ (версия SELECT @@version
показывает Adaptive Server IQ / 12.5.0 / 0306) с использованием расширения PHP SQL Anywhere.
Я не могу выбрать все строки, т.е. SELECT * from anytable
всегда возвращает 30 строк.
Единственный обходной путь, который я нашел, использует SELECT TOP 1000 * from anytable
(максимум 32767), но есть определенные ситуации, когда мне нужны все строки.
Буду признателен за любую оказанную помощь.
РЕДАКТИРОВАТЬ: пример сценария (очень похоже на документация)
$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);
РЕДАКТИРОВАТЬ: спецификации обеих машин, где я испытываю та же самая проблема:
Разработка машины:
Производственный сервер:
Вероятно, глупый вопрос, но просто чтобы быть уверенным.
Вы проверили в Client -> Tools -> Sybase IQ -> Максимальное количество отображаемых строк.
(прошу прощения за то, что опубликовал это как ответ, но у меня недостаточно представителей, чтобы спросить вас в комментариях.)
Ну, возможно, где-то есть настраиваемое свойство, которое освободит вас от злых когтей 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);