Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Курсоры #186

Open
avid opened this issue Apr 25, 2013 · 5 comments
Open

Курсоры #186

avid opened this issue Apr 25, 2013 · 5 comments

Comments

@avid
Copy link

avid commented Apr 25, 2013

Коллеги, у меня появилась необходимость последовательно читать из БД огромное количество объектов. Для этого хотелось бы использовать курсоры, которых у нас в onPHP, к сожалению, нет.

В связи с этим я решил добавить их поддержку в наш любимый фреймфорк. В PostgreSQL и MySQL они существуют, а базовое использование реализованы практически идентично:
http://www.postgresql.org/docs/9.2/static/plpgsql-cursors.html
http://dev.mysql.com/doc/refman/5.6/en/cursors.html

Использование курсов подразумевает исполнение следующих SQL-команд:

DECLARE cursor_name CURSOR FOR SELECT * FROM sample_table;

OPEN cursor_name;

FETCH cursor_name INTO rowvar;

CLOSE cursor_name;

Как лучше реализовать выполнение таких запросов в рамках нашего фремворка?

И еще один вопрос. MySQL поддерживает только описанные выше 4 команды, а PostgreSQL поддерживает еще достаточно большой спектр возможностей для работы с курсорами. Как минимум для PostgreSQL хотелось бы еще реализовать доступные операции по перемещению курсора на первую и последнюю позиции, а также перемещение вперед и назад на произвольное количество строк. Как лучше сделать такую вот кастомизацию в концепции фреймворка?

@AlexeyDsov
Copy link
Member

А как именно хочется их использовать? Просто запросы или что б прям критерия с ними умела работать?

@AlexeyDsov
Copy link
Member

Ещё один вопрос по postgresql - курсоры разве не относится только к PL/pgSQL? (А в mysql, кстати, к процедурам)

@avid
Copy link
Author

avid commented Apr 29, 2013

А как именно хочется их использовать? Просто запросы или что б прям критерия с ними умела работать?

Сейчас прототип выглядит достаточно просто. Добавил к критерии метод getCursor(), который возвращает класс Cursor. Соответственно должны быть методы типа getNext (возвращает объект) и getNextRow (возвращает массив). Нужна мне эту штуковина для перебора данных в больших таблицах, чтобы избавиться от множества select'ов с limit и offset.

Ещё один вопрос по postgresql - курсоры разве не относится только к PL/pgSQL? (А в mysql, кстати, к процедурам)

В PostgreSQL вполне себе работает вне процедур. Единственная особенность - работает только внутри транзакции. Собственно приведенные в первом посте запросы как раз взяты из моей проверки постгреса.
На счёт MySQL точно сказать не могу, но попробую на майских протестить.

И еще один момент. Пока реализовал совсем в простом виде курсор для постгреса - 250 тысяч объектов из БД пробегает где-то за минуту. Кстати тест я проводил в виртуалке на ноуте.

@AlexeyDsov
Copy link
Member

странно, у меня про "open" postgres сказал что не знает такого.

@avid
Copy link
Author

avid commented Apr 30, 2013

Ай, ошибочка. OPEN нужно только при работе внутри процедуры. В случае работы из php DECLARE сразу открывает курсор на чтение.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants