Прямой SQL
Модераторы: m0p3e, edward_K, Модераторы
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
А #double раньше использовали ?
вроде не было такого в константах dsql....
вроде не было такого в константах dsql....
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Прямой SQL
Убрал Double, ошибка синтаксиса ушла, но рантайм остался!
Ошибки рантайма те же.
Ошибки рантайма те же.
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Прямой SQL
Доброго времени суток!
Уважаемые форумчане, может кто натолкнет на мысль, как бороться с рантаймом (см. предыдыдущий мой пост)?
Похоже Оракл не вомпринимает попытку Галактики изменить таблу. Как обходить?
Уважаемые форумчане, может кто натолкнет на мысль, как бороться с рантаймом (см. предыдыдущий мой пост)?
Похоже Оракл не вомпринимает попытку Галактики изменить таблу. Как обходить?
Re: Прямой SQL
Что сейчас пишется в ora90drv?
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Прямой SQL
Странно, но сегодня чего-то ничего не пишется. Подвисает на этапе update. В log ничего не попадает, причем раньше такого не было, шел рантайм.m0p3e писал(а):Что сейчас пишется в ora90drv?
Re: Прямой SQL
Рантайм это следствие ошибки при работе с DSQL. Исправляем ошибку - пропадает рантайм.
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Прямой SQL
m0p3e писал(а):Рантайм это следствие ошибки при работе с DSQL. Исправляем ошибку - пропадает рантайм.
Однако update все же не проходит!
Re: Прямой SQL
В данной ситуации план действия всегда один. Берем работающий примитив и начинаем его накручивать.savov писал(а):Однако update все же не проходит!
Набросал интерфейсик для проверки модификации стандартных таблиц через прямой SQL:
Код: Выделить всё
Interface Check_SQL;
Create View
Var
As Select *
From x$users
;
HandleEvent
cmInit :
{
var stmt, stmt_str : LongInt;
stmt := sqlAllocStmt;
sqlAddStr ( stmt_str, 'Update Persons Set Persons.PassNMB='#39 + 'DSQL'#39 + ' Where Persons.StrTabN='#39 + '4516'#39 );
sqlPrepare ( stmt, stmt_str );
sqlExecute ( stmt );
sqlFreeStr ( stmt_str );
sqlFreeStmt ( stmt );
}; //cmInit
End;
END.
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Прямой SQL
Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!m0p3e писал(а):В данной ситуации план действия всегда один. Берем работающий примитив и начинаем его накручивать.
Набросал интерфейсик для проверки модификации стандартных таблиц через прямой SQL:
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
Re: Прямой SQL
Опс. Про жабу не заметил. Сталкиваться с ней пока не приходилось.savov писал(а):Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
-
- Постоянный гость
- Сообщения: 74
- Зарегистрирован: 23 июн 2007, 23:07
- Откуда: ТопСофт, Минск
Re: Прямой SQL
Использую следующую конструкцию
При исполнении получаю ошибку 311, а в лог-файле ms70drv.log следующее
Подскажите, пожалуйста, что сделано неправильно?
Код: Выделить всё
table struct SellsAggr
(
cAn : array[1..3] of comp,
Sum : double
)
with index
(
SellsAggr01 = cAn[1] + cAn[2] + cAn[3]
);
.....................................................
delete all SellsAggr;
dFrom := dBegDate;
dTo := dEndDate;
cAttrNam_NaprIsp := piExtAttr.AttrID(coKatZak, cAttrNam_NaprIsp_Name);
cAttrNam_KontrVid := piExtAttr.AttrID(coKatOrg, cAttrNam_KontrVid_Name);
if cAttrNam_NaprIsp <> 0 and cAttrNam_KontrVid <> 0
{
SellsAggrFillQuery := SQLQUERY (.
SELECT KatOrg.NRec,
NaprIsp.NaprIsp_vComp,
KontrVid.KontrVid_vComp,
SUM(SpZakaz.SumUsl) as SumUslAggr
FROM
PutLst
INNER JOIN KatZak ON KATZAK.CPUTLST = PUTLST.NREC
INNER JOIN KATORG ON KATZAK.CORG = KATORG.NREC
LEFT OUTER JOIN SPZAKAZ ON KATZAK.NREC = SPZAKAZ.CKATZAK
LEFT OUTER JOIN
(SELECT ATTRVAL_NaprIsp.cRec as NaprIsp_cRec, ATTRVAL_NaprIsp.vComp as NaprIsp_vComp
FROM ATTRVAL AS ATTRVAL_NaprIsp
WHERE (ATTRVAL_NaprIsp.CATTRNAM = :(cAttrNam_NaprIsp) )
) AS NaprIsp ON KatZak.NRec = NaprIsp.NaprIsp_cRec
LEFT OUTER JOIN
(SELECT ATTRVAL_KontrVid.cRec as KontrVid_cRec, ATTRVAL_KontrVid.vComp as KontrVid_vComp
FROM ATTRVAL AS ATTRVAL_KontrVid
WHERE (ATTRVAL_KontrVid.CATTRNAM = :(cAttrNam_KontrVid) )
) AS KontrVid ON KatOrg.NREC = KontrVid.KontrVid_cRec
WHERE (PUTLST.DATOBR >= :(dFrom) )
AND (PUTLST.DATOBR <= :(dTo) )
AND (PUTLST.STATPL = :(StatPl) )
GROUP BY KatOrg.NRec,
NaprIsp.NaprIsp_vComp,
KontrVid.KontrVid_vComp
.);
StatPl := 1;
var err : word;
err := sqlSelectInto(SellsAggrFillQuery, tnSellsAggr);
message(err);
Код: Выделить всё
11.07.2012 01:24:43 [GALAXY81#VIKTOR]:
SELECT T$KATORG.F$NREC, NAPRISP.NAPRISP_VCOMP, KONTRVID.KONTRVID_VCOMP, SUM( T$SPZAKAZ.F$SUMUSL ) SUMUSLAGGR FROM T$PUTLST INNER JOIN T$KATZAK ON ( T$KATZAK.F$CPUTLST = T$PUTLST.F$NREC ) INNER JOIN T$KATORG ON ( T$KATZAK.F$CORG = T$KATORG.F$NREC ) LEFT OUTER JOIN T$SPZAKAZ ON ( T$KATZAK.F$NREC = T$SPZAKAZ.F$CKATZAK ) LEFT OUTER JOIN (SELECT ATTRVAL_NAPRISP.F$CREC NAPRISP_CREC, ATTRVAL_NAPRISP.F$VCOMP NAPRISP_VCOMP FROM T$ATTRVAL ATTRVAL_NAPRISP WHERE ( ( ATTRVAL_NAPRISP.F$CATTRNAM = ? ) )) NAPRISP ON ( T$KATZAK.F$NREC = NAPRISP.NAPRISP_CREC ) LEFT OUTER JOIN (SELECT ATTRVAL_KONTRVID.F$CREC KONTRVID_CREC, ATTRVAL_KONTRVID.F$VCOMP KONTRVID_VCOMP FROM T$ATTRVAL ATTRVAL_KONTRVID WHERE ( ( ATTRVAL_KONTRVID.F$CATTRNAM = ? ) )) KONTRVID ON ( T$KATORG.F$NREC = KONTRVID.KONTRVID_CREC ) WHERE ( ( T$PUTLST.F$DATOBR >= ? ) AND ( T$PUTLST.F$DATOBR <= ? ) AND ( T$PUTLST.F$STATPL = ? ) ) GROUP BY T$KATORG.F$NREC, NAPRISP.NAPRISP_VCOMP, KONTRVID.KONTRVID_VCOMP
11.07.2012 01:24:43 [GALAXY81#VIKTOR]:
07002: [Microsoft][ODBC SQL Server Driver]Неправильное поле COUNT или ошибка синтаксиса
11.07.2012 01:24:43 [GALAXY81#VIKTOR]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
1. бросается что не сделан какой то exec.... т.е Вы задали запрос, не выполнили его, и сразу пытаетесь считать что он возвращает (ну или Вы опустили его в приведенном коде ?)Friendlyman писал(а): Подскажите, пожалуйста, что сделано неправильно?
2. Поименованные параметры как то не фурычат в приведенном примере (( ....пока параметры не забиндишь ( или не сделаешь setParam (это если объектный интерфейс использовать )), то все равно огребаешь ошибку 311
Я попробовал упрощенный пример (у меня все равно нет данных под таблицы модулей этих...). Вот так работает с bind (с поименованными параметрами нифига не вышло с использованием sqlquery):
var err : word;
sqlbindparam(stmt,1,dFrom);
err:=sqlExecStmt(stmt, sqlquery(SELECT
KatOrg.NRec,
SUM(SpZakaz.SumUsl)
FROM
PutLst
INNER JOIN KatZak ON KATZAK.CPUTLST = PUTLST.NREC
INNER JOIN KATORG ON KATZAK.CORG = KATORG.NREC
LEFT OUTER JOIN SPZAKAZ ON KATZAK.NREC = SPZAKAZ.CKATZAK
WHERE (PUTLST.DATOBR >=?)
GROUP BY KatOrg.NRec
)
);
message(err);
в месседж получаем 0 и запрос до сервера доходит ок.
-
- Постоянный гость
- Сообщения: 74
- Зарегистрирован: 23 июн 2007, 23:07
- Откуда: ТопСофт, Минск
Re: Прямой SQL
Дока как раз гласит, что sqlSelectInto выполняет запрос в таблицу, так что с п.1. вроде все норм.
А вот связывание по именам может и правда не работает как надо... Но хотелось именно так сделать, изящно с точки зрения кода...
Может еще какие соображения?
Я вот подумал, может я логическую таблицу в vip неправильно построил...
А вот связывание по именам может и правда не работает как надо... Но хотелось именно так сделать, изящно с точки зрения кода...
Может еще какие соображения?
Я вот подумал, может я логическую таблицу в vip неправильно построил...
Функция sqlSelectInto
Назначение
Выполнить запрос в таблицу (например, в таблицу в памяти).
Загрузка полученной выборки в таблицу управляется логической таблицей интерфейса. Поэтому количество полей таблицы, выбранных в логической таблице (т.е. перечисленных в конструкции select ЛТ), и их порядок в ЛТ должны совпадать с количеством полей, выбранных в конструкции select запроса прямого SQL, и их порядком.
Начиная с Атлантиса 5.4.22 выполняется контроль количества полей, перечисленных в ЛТ для загружаемой таблицы и в выборке DSQL. При их несовпадении функция возвращает ошибку tsDirectSQLIfcError.
Корректность порядка и типов выбираемых полей не производится. Т.о. если будет непреодолимая некорректность, то не сработает встроенный в клиенты СУБД конвертор типов данных, и выдастся ошибка, которая и вернется в качестве результата выполнения функции.
Описание
function sqlSelectInto(str_stmt : string; iTable : integer) : integer;
Параметры
str_stmt - текст запроса.
iTable - код таблицы.
Возвращаемое значение
Функция возвращает код ошибки. В т.ч. при несовпадении количества полей в ЛТ и в выборке функция возвращает ошибку tsDirectSQLIfcError.
Версия
Контроль количества полей, перечисленных в ЛТ для загружаемой таблицы и в выборке DSQL, выполняется начиная с Атлантиса 5.4.22.
Начиная с Атлантиса 5.2.07.
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
да про sqlSelectInto согласен...недосмотрелFriendlyman писал(а):Дока как раз гласит, что sqlSelectInto выполняет запрос в таблицу, так что с п.1. вроде все норм.
А вот связывание по именам может и правда не работает как надо... Но хотелось именно так сделать, изящно с точки зрения кода...
Может еще какие соображения?
Я вот подумал, может я логическую таблицу в vip неправильно построил...
Со связыванием явно какая то муть. ЛОТ ,судя по всему у Вас нормальный (а то получили бы почти наверняка tsDirectSQLIfcError)
С изящностью соглашусь ..))
Но я посмотрел по прикладным сырцам - практически нигде не используют парни из галактики sqlSelectInto если запрос нужен с параметром. Они его в этом случае готовят(собирают) заранее и потом уже отдают в sqlSelectInto. Наверное это неспроста )
-
- Постоянный гость
- Сообщения: 74
- Зарегистрирован: 23 июн 2007, 23:07
- Откуда: ТопСофт, Минск
Re: Прямой SQL
Оказывается есть ПИР 101.48417 Не работает sqlExecDirect, если текст запроса содержит именованные параметры