Прямой SQL
Модераторы: m0p3e, edward_K, Модераторы
Прямой SQL
Всем доброго времени суток.
Пришло желание начать активно использовать прямой sql. Все заявленные в доке функции вроде работают. Начинаешь писать запрос, не просто так, а настоящий запрос, чтобы одним маневром получить уже готовые данные, фильтрованые, групированые, агрегирование ... запрос получается ЗАЧЕТНЫМ. И тут то вылезает одно такое неприятное НО. Этот запрос не фига не влазиет в переменную типа string так как ее длина ограничена жалкими 255 символами.
Как же быть, может кто нить просветить?
Может я чего то незнаю?
В противном случае не вижу не малейшего смысла от этого прямого SQL если туда не удается протиснуть даже мало мальский запросик.
Пришло желание начать активно использовать прямой sql. Все заявленные в доке функции вроде работают. Начинаешь писать запрос, не просто так, а настоящий запрос, чтобы одним маневром получить уже готовые данные, фильтрованые, групированые, агрегирование ... запрос получается ЗАЧЕТНЫМ. И тут то вылезает одно такое неприятное НО. Этот запрос не фига не влазиет в переменную типа string так как ее длина ограничена жалкими 255 символами.
Как же быть, может кто нить просветить?
Может я чего то незнаю?
В противном случае не вижу не малейшего смысла от этого прямого SQL если туда не удается протиснуть даже мало мальский запросик.
Код: Выделить всё
sqlAddStr(str_handle ,'Select ');
sqlAddStr(str_handle ,'* ');
sqlAddStr(str_handle ,'From ');
sqlAddStr(str_handle ,'X$tables ');
sqlAddStr пожалуй должен был мне помочь но вот что то не выходит
есть такая процедура, она работает без проблем
а вот попытался сделать используя slqAddStr, не допер что то как ее коректно, использовать, на выходе не чего нет
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?
есть такая процедура, она работает без проблем
Код: Выделить всё
procedure ExampleSELECT1;
{
var stmt : longInt;
var query : string;
var field1 : string;
// разместить хэндл под запрос
stmt := sqlAllocStmt;
// подготовим запрос
query := '';
query := query + 'select Lschet.TabN ';
query := query + 'from ';
query := query + 'Lschet ';
sqlPrepare(stmt, query);
sqlBindCol(stmt, 1, field1);
// выполним запрос
sqlExecute(stmt);
// прогоним выбраные записи
while (sqlFetch(stmt) = tsOk)
LogStrToFile(logFile, field1);
// осбоводим хэндл
sqlFreeStmt(stmt);
}
Код: Выделить всё
procedure ExampleSELECT2;
{
var stmt : longInt;
var str_handle : longInt;
var query : string;
var field1 : string;
// разместить хэндл под запрос
stmt := sqlAllocStmt;
// подготовим запрос
sqlFreeStmt(str_handle);
sqlAddStr(str_handle, 'select Lschet.TabN ');
sqlAddStr(str_handle, 'from ');
sqlAddStr(str_handle, 'Lschet ');
// привяжем поле
sqlBindCol(stmt, 1, field1);
// выполним запрос
sqlExecute(stmt);
// покажем данные
while (sqlFetch(stmt) = tsOk)
LogStrToFile(logFile, field1);
sqlFreeStmt(stmt);
}
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Вроде sqlPrepare(stmt, str_handle) забыли простоHmyrii писал(а):...а вот попытался сделать используя slqAddStr, не допер что то как ее коректно, использовать, на выходе не чего нет
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?Код: Выделить всё
procedure ExampleSELECT2; { var stmt : longInt; var str_handle : longInt; var query : string; var field1 : string; // разместить хэндл под запрос stmt := sqlAllocStmt; // подготовим запрос sqlFreeStmt(str_handle); sqlAddStr(str_handle, 'select Lschet.TabN '); sqlAddStr(str_handle, 'from '); sqlAddStr(str_handle, 'Lschet '); // привяжем поле sqlBindCol(stmt, 1, field1); // выполним запрос sqlExecute(stmt); // покажем данные while (sqlFetch(stmt) = tsOk) LogStrToFile(logFile, field1); sqlFreeStmt(stmt); }
хотел уж было написать про то что вы не внимательно читали хелп, что у данной ф-ции первый параметр это хэндл (longint), а второй это запрос (string)Den писал(а): Вроде sqlPrepare(stmt, str_handle) забыли просто
а потом думаю ... а дай попробуй залепить ей туда вместо запроса хэндл на запрос ... а в голове мысль "только зря время потрачу, в доке же ясно написано" ...
и прокатило, вот большое спасибо за явно неординарный ответ
-
- Местный житель
- Сообщения: 370
- Зарегистрирован: 28 сен 2006, 15:43
- Откуда: Санкт-Петербург
- Контактная информация:
В документации смущает такая фраза:
То есть, в ней не сказано, что это невозможно..
Код: Выделить всё
"Однако на Pervasive SQL доступ через прямой SQL и доступ через классический интерфейс идет через разные коннекты (разные сервисы). В результате доступ через разные механизмы к одним и тем же данным будет приводить к взаимной блокировке. Необходимо учитывать эти особенности при разработке алгоритмов со смешанным типом доступа к данным.
"
-
- Местный житель
- Сообщения: 370
- Зарегистрирован: 28 сен 2006, 15:43
- Откуда: Санкт-Петербург
- Контактная информация:
У меня вопрос. Есть два варианта кода:
1)
2)
То есть во втором варианте подготавливаю запрос, а потом лишь меняю параметры. По идее второй должен отработать быстрее, так оно и есть. Но вот результаты почему-то совершенно разные. Правильно выбирается только в первом случае, во втором результатов примерно в два раза меньше. Что не так делаю?
1)
Код: Выделить всё
SetVisualHeader('Сохранение настроек'#13''+
'Заполнение таблицы')
_Loop TfUsers {
stmt := sqlAllocStmt;
sqlBindParam(stmt, 1, TfUsers.Obj);
sqlBindParam(stmt, 2, TfUsers.cUser);
sqlExecStmt(stmt, 'SELECT'+
' V.cTune'+
',D.code'+
',V.obj'+
',V.cUser'+
',V.longVal'+
',V.doubleVal'+
',V.dateVal'+
',V.timeVal'+
',V.compVal'+
',V.strVal'+
',V.isEmpty'+
',V.strEmpty'+
' FROM TuneVal as V '+
'inner join TuneDef as D on V.cTune = D.Nrec'+
' WHERE V.Obj = ? AND V.cUser = ?');
sqlFetchInto(stmt, tnTfTunes);
sqlFreeStmt(stmt);
NextVisual;
}
Код: Выделить всё
stmt := sqlAllocStmt;
sqlPrepare(stmt, 'SELECT'+
' V.cTune'+
',D.code'+
',V.obj'+
',V.cUser'+
',V.longVal'+
',V.doubleVal'+
',V.dateVal'+
',V.timeVal'+
',V.compVal'+
',V.strVal'+
',V.isEmpty'+
',V.strEmpty'+
' FROM TuneVal as V '+
'inner join TuneDef as D on V.cTune = D.Nrec'+
' WHERE V.Obj = ? AND V.cUser = ?');
sqlBindParam(stmt, 1, TfUsers.Obj);
sqlBindParam(stmt, 2, TfUsers.cUser);
SetVisualHeader('Сохранение настроек'#13''+
'Заполнение таблицы')
_Loop TfUsers {
sqlExecute(stmt);
sqlFetchInto(stmt, tnTfTunes);
NextVisual;
}
sqlFreeStmt(stmt);