:: Visual Foxpro, Foxpro for DOS
Пакет запросов для SQLEXEC()
FoxKot
Автор

Сообщений: 14
Дата регистрации: 25.03.2016
Столкнулся с проблемой : для ускорения обмена информацией из FoxPro в mySQL в команду SQLEXEC(nStatementHandle, cSQLCommand ...) в качестве cSQLCommand написал пакет из DELETE... и INSERT... , разделенные точкой с запятой ( по правилам пунктуации mySQL ). Не сработало
Вопрос - это в принципе нельзя делать или я чего-то не знаю?
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Приводи содержимое переменной cSQLCommand, делов то
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
Будрин

Сообщений: 180
Откуда: Москва
Дата регистрации: 21.09.2001
Если MySql бесплатный, то у вас ничего не получится. А для полной информации почитайте help по MySql. Или спросите на работе рядом сидящих сотрудников.
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
FoxKot
Автор

Сообщений: 14
Дата регистрации: 25.03.2016
Вот как-то так :

lcDelete = 'DELETE FROM product_image WHERE (product_id=123);'

lcInsert = 'INSERT INTO product_image (product_id,name) VALUES (123,"p1.jpg"),(123,"p2.jpg);'

lcSelect = lcDelete + lcInsert

lnResult = SQLEXEC ( pnLink, lcSelect )
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Прежде всего нужно включить поддержку батчей. Это опция MULTI_STATEMENTS - включается через Option=67108864
dev.mysql.com


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
WbrErr

Сообщений: 1960
Дата регистрации: 05.12.2006
В данном случае я бы вообще использовал вызов хранимой процедуры с параметром.
Ratings: 0 negative/1 positive
Re: Пакет запросов для SQLEXEC()
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
FoxKot
lcInsert = 'INSERT INTO product_image (product_id,name) VALUES (123,"p1.jpg"),(123,"p2.jpg);'
А разве двойные кавычки не ошибка в синтаксисе SQL?
Может надо так исправить:
lcInsert = [INSERT INTO product_image (product_id,name) VALUES (123,'p1.jpg'),(123,'p2.jpg');]
И вот тут:
(123,"p2.jpg)
нет кавычки ...


------------------
Без коментариев..




Исправлено 1 раз(а). Последнее : Перминов Игорь, 31.10.17 10:17
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Перминов Игорь
А разве двойные кавычки не ошибка в синтаксисе SQL?
Может надо так исправить:
lcInsert = [INSERT INTO product_image (product_id,name) VALUES (123,'p1.jpg'),(123,'p2.jpg');]
...

1. Да "двойная кавычка не допускается"

2. Что бы в символьной строке передать символьный литерал используют "экранирующую" одинарную кавычку, очень смахивающую на войную:
lcInsert = 'INSERT INTO product_image (product_id,name) VALUES (123,''p1.jpg''),(123,''p2.jpg'');'

3. Более "кошерно" передавать параметры через "?", поскольку неизвестео какие ещё спец символы могут встретиться в символьном литерале, которые надо будет экранировать (правда у такого подхода есть и свой минус - это нельзы в логе ошибок увидеть истинные значения переданные на сервер)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 31.10.17 10:47
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
PaulWist
1. Да "двойная кавычка не допускается"
Это зависит от того где именно используется (для строковых литералов или для квотирования имён объектов (полей, таблиц)) - для какой СУБД и каких средств доступа, а ещё и от настроек... dev.mysql.com

PaulWist
2. Что бы в символьной строке передать символьный литерал используют "экранирующую" одинарную кавычку, очень смахивающую на войную:
Не в фоксе. Для фокса сия команда будет синтаксически неверной. Вот в САМОЙ СУБД вполне может быть и такое реализовано - но тут то речь про фоксовую команду создающую фоксовую строковую переменную...
PaulWist
3. Более "кошерно" передавать параметры через "?", поскольку неизвестео какие ещё спец символы могут встретиться в символьном литерале, которые надо будет экранировать (правда у такого подхода есть и свой минус - это нельзы в логе ошибок увидеть истинные значения переданные на сервер)
Смотря кем и как создаётся этот самый лог. Если со стороны фокса, то нет проблем и значения переменных в лог ошибок записать. Хоть всех, хоть "по шаблону", если в SPT-запросах принять определённое "соглашение по именованию". Со стороны сервера (или клиентских библиотек доступа) тоже должна быть такая возможность (для оракла в принципе всё видно - хотя, конечно, от версии "средства мониторинга" и от настроек зависит).
Другое дело, что параметризация крайне плохо сочетается с конкретно таким типом запросов - "многозаписным INSERT VALUES", равно как и вообще с (генерируемыми) батчами (даже всего на 10 DML команд - это ж сколько параметров то потребуется ). Параметризация хороша для статических но очень часто используемых команд - например для посылки ОДНОЙ записи из GUI на сервер в команде INSERT, или для "типичного SELECT запроса" - скажем выборка всех товаров по начальным символам названия и коду поставщика.

Кстати, автору на заметку - зачастую просто переход к ручному управлению транзакциями и некоторые настройки клиента (ODBC) способны увеличить скорость "заливки" данных тривиальным циклом с множеством отдельных команд до того же, что даст и работа с милионно-строчными батчами.
А вообще для "массовой погрузки" во всех серверах существуют специальные команды/режимы/утилиты. В частности для MySQL это LOAD DATA INFILE и использующая эту возможность утилита mysqlimport.
Как правило скорость погрузки данных через подобные средства на порядок выше чем любые "тонко оптимизированные" обычные команды. К сожалению не во всех сценариях эти средства применимы... Обычно без проблем работает сценарий "залить все данные в пустую таблицу". Для объединения/хитрого слияния данных это скорее всего не подойдёт...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Igor Korolyov
Это зависит от того ... - для какой СУБД и каких средств доступа, а ещё и от настроек... dev.mysql.com
...

Да, прозевал, что вопрос про MySql.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
PaulWist
Igor Korolyov
Это зависит от того ... - для какой СУБД и каких средств доступа, а ещё и от настроек... dev.mysql.com
...

Да, прозевал, что вопросgkz
[i][/i] про MySql.
мдя
Ratings: 0 negative/0 positive
Re: Пакет запросов для SQLEXEC()
FoxKot
Автор

Сообщений: 14
Дата регистрации: 25.03.2016
Перминов Игорь
FoxKot
lcInsert = 'INSERT INTO product_image (product_id,name) VALUES (123,"p1.jpg"),(123,"p2.jpg);'
А разве двойные кавычки не ошибка в синтаксисе SQL?
Может надо так исправить:
lcInsert = [INSERT INTO product_image (product_id,name) VALUES (123,'p1.jpg'),(123,'p2.jpg');]
И вот тут:
(123,"p2.jpg)
нет кавычки ...

Двойные кавычки не ошибка. Я с ними работал. Опечатка, замеченная в моем примере - только в примере.
А вот Igor Korolyov написал :

Igor Korolyov
Прежде всего нужно включить поддержку батчей. Это опция MULTI_STATEMENTS - включается через Option=67108864
dev.mysql.com

Вот эта версия вроде бы срабатывает. Я смогу только в понедельник проверить и обязательно отпишусь.
Всем огромное спасибо!
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика