Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к курсору -> must be created with SELECT ... INTO TABLE / 13 сообщений из 13, страница 1 из 1
01.06.2004, 13:09
    #32542636
Moleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Есть файл aaa.dbf

Делается:
select * from aaa where name='M' into cursor zzz

Результат курсор zzz

Потом:
select * from zzz where name='Mo' into cursor xxx

Результат: "<cursor>" must be created with SELECT ... INTO TABLE.

Вопрос: Почему так, если на других машинах работает.
Установлен FoxPro6.0
...
Рейтинг: 0 / 0
01.06.2004, 13:18
    #32542662
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Потому, чо при определенных обстоятельствах, вместо создания курсора как временной таблицы иногда таблица источник просто переоткрывается в другой рабочей области с наложенным фильтром. По таким "отфильтрованным" таблицам недопустимо делать повторный запрос. Чтобы этого избежать надо давать опцию NOFILTER:

select * from aaa where name='M' into cursor zzz NOFILTER

select * from zzz where name='Mo' into cursor xxx

Подробнее читай здесь

http://]http://www.foxclub.ru/kb/index.php?sid=24056&aktion=artikel&rubrik=001&id=6&lang=ru

Раздел "Курсор"
...
Рейтинг: 0 / 0
01.06.2004, 13:18
    #32542666
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
...
Рейтинг: 0 / 0
01.06.2004, 13:44
    #32542743
Moleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Извините, а можно настройками FoxPro установить по умолчанию NOFILTER?
...
Рейтинг: 0 / 0
01.06.2004, 14:20
    #32542861
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Нет. Это одна из опций команды Select-SQL. Причем только в том случае, если запрос отправляется в курсор (INTO CURSOR)
...
Рейтинг: 0 / 0
01.06.2004, 14:35
    #32542907
Moleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
...
Рейтинг: 0 / 0
01.06.2004, 19:23
    #32543567
Moleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Все равно не дает мне покоя, почему на других машинах не требуется NOFILTER?
И что это за « …различные условия, от которых этот курсор может иметь разное физическое "воплощение" и разные свойства…»
Можно их как-то обойти? :)
Может поставить FoxPro 7 или там это тоже есть? :(
...
Рейтинг: 0 / 0
01.06.2004, 20:52
    #32543636
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
в VFP 7.0 это уже есть...
...
Рейтинг: 0 / 0
02.06.2004, 09:41
    #32543984
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
А по ссылке сходить - религия не позволяет? Вот выдержка оттуда:

******************************************************************************
(...)

В зависимости от различных условий этот курсор может иметь разное физическое "воплощение" и разные свойства

Если SQL-запрос полностью оптимизируем, то вместо создания нового файла будет просто открыта та же самая таблица с наложенным на нее фильтром. Зачастую это очень неприятная неожиданность. Проверить, чем же физически является сформированный курсор, можно используя функцию DBF()

Код: plaintext
1.
  SELECT * FROM MyTable INTO CURSOR TmpTable  
  ?DBF('TmpTable')   


Если будет возвращено имя файла с расширением DBF, то данный курсор является той же самой исходной таблицей с наложенным на нее фильтром.

Если Вы хотите при любых запросах быть уверенными, что курсор - это именно временная таблица, а не исходная таблица с наложенным фильтром, то Вам следует добавить опцию NOFILTER

Код: plaintext
  SELECT * FROM MyTable INTO CURSOR TmpTable NOFILTER  


Эта опция появилась только в 5 версии Visual FoxPro, хотя там она еще не была документирована. В более ранних версиях необходимо добавлять фиктивные условия или признаки группировки, чтобы исключить возможность оптимизации.

Однако если курсор - это временная таблица, то это еще не значит, что эта временная таблица будет непременно физически расположена на диске. Вполне возможно, что вся временная таблица целиком поместится в оперативную память. Т.е. функция DBF('TmpTable') будет исправно показывать некий временный файл, но попытка найти его физически на диске окончится неудачей и функция FILE(DBF('TmpTable')) вернет .F.

Правда расположение временной таблицы целиком в памяти ни в коем случае не помешает работе с этой временной таблицей. Собственно, в подавляющем большинстве случаев Вас и не должно заботить где физически расположена та или иная таблица.
...
Рейтинг: 0 / 0
02.06.2004, 09:45
    #32543989
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Если говроить конкретно о запросе

select * from aaa where name='M' into cursor zzz

то будет наложен фильтр, если существует индекс по полю name и этот индекс используется в rushmore-оптимизации данного запроса.

Переход на любую другую версию ничего не даст. Срособ работы один для всех.
...
Рейтинг: 0 / 0
02.06.2004, 10:11
    #32544057
Moleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Статью я читал, спасибо очень интересная и много что я узнал.

Но меня интересует: почему на ОДНИХ машинах, где установлен FoxPro, после запроса ВСЕГДА формируется временная таблица, а на других НЕТ. И как на результат запроса может зависеть, на какой машине он выполняется.

P.S. По полю name существует индекс. :)
...
Рейтинг: 0 / 0
02.06.2004, 10:23
    #32544097
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Это зависит не от машины, а от уровня оптимизации запроса. Уровень оптимизации можно проверить, используя функцию SYS(3054).

В частности, на него влияюте еще такие факторы:

-) Текущая настройка SET DELETED
-) Если используется SET DELETED ON, то факт наличия индекса по выражению deleted()
-) Факт совпадения текущей настройки SET COLLATE и значение IDXCollate() индексов

Но по большому счету, трудно сказать, когда именно в результате выполнения запроса будет именно открыта та же таблица с наложенным фильтром. Это нигде не описывается подробно. Просто такое может быть. Тот факт, что это обычно происходит при полной оптимизации было установлено опытным путем. Но это вовсе не значит, что это единственное условие.

Поэтому, просто возьмите за правило, всегда, если Вы используете опцию INTO CURSOR, ставить дополнительную опцию NOFILTER.
...
Рейтинг: 0 / 0
02.06.2004, 10:33
    #32544132
Moleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к курсору -> must be created with SELECT ... INTO TABLE
Большое спасибо, посмотрю в данном направлении.

Что надо ставить NOFILTER это я понимаю, но мне в наследство осталось много программ на FoxPro, где нет NOFILTER. Несколько уже отказались работать – пришлось срочно переписывать. Вот мне и хотелось решить данную проблему одним флажком. :)

Еще раз огромное спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к курсору -> must be created with SELECT ... INTO TABLE / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]