Страница 11 из 19
Re: Прямой SQL
Добавлено: 20 июл 2012, 12:18
RAJAH
А если так?
Код: Выделить всё
...
tmpstr="update katbox set katbox.count="+AllInPallet+" where katbox.nrec=";
sstr4_1=tmpstr+#comp("+nreckatbox+")";
...
Re: Прямой SQL
Добавлено: 20 июл 2012, 12:42
savov
Та же ошибка.
Re: Прямой SQL
Добавлено: 20 июл 2012, 12:43
savov
RAJAH писал(а):А если так?
Код: Выделить всё
...
tmpstr="update katbox set katbox.count="+AllInPallet+" where katbox.nrec=";
sstr4_1=tmpstr+#comp("+nreckatbox+")";
...
Та же ошибка ( см. выше)
Re: Прямой SQL
Добавлено: 23 июл 2012, 15:47
Den
Это баг быстрее всего.
Похожее было в ПИР :
* ПРОБЛЕМА В ПИР: 102.75917
* ПЕРВОЕ РЕШЕНИЕ: 5.4.14.0
* КРАТКОЕ ОПИСАНИЕ: Не возможно использовать в DirectSQL поле RsvOper.Sum
* ПРОЕКТ: Предложение по новой функциональности Атлантиса
* ДЕТАЛИЗАЦИЯ: ?
# ЧТО ИЗМЕНЕНО: Не возможно использовать в DirectSQL поле RsvOper.Sum при
использовании этого поля в агрегатной функции SUM
Пример.
select Sum(RsvOper.sum)
from rsvoper
В лог выдает следующую информацию:
select Sum(RsvOper.sum) from rsvoper
Ошибка(1,19): Ожидался идентификатор
# КАК ИЗМЕНЕНО: Ключевое слово SUM сделано неключевым
Re: Прямой SQL
Добавлено: 08 авг 2012, 18:16
savov
Den писал(а):Это баг быстрее всего.
Галактика зарегистрировала это в ПИР.
Но мне их ждать долго.
Попробовал обходной маневр.
В oracle написал функцию изменения поля:
Код: Выделить всё
CREATE OR REPLACE FUNCTION updtkatbox(NRECREC IN VARCHAR2, MAXC IN NUMBER)
RETURN INTEGER
IS
procedure UPDKATBOX_PR is
pragma autonomous_transaction;
begin
UPDATE VRN.KATBOX SET FCOUNT=MAXC WHERE FNREC=NRECREC;
COMMIT;
END;
begin
UPDKATBOX_pr;
return 1;
END;
В Галактике пытаюсь сделать:
Код: Выделить всё
sstr4_2='select updtkatbox(#comp('+nreckatbox+'),'+AllInPallet_Alg+') from dual';
Message(sstr4_2,0);
iHandle4_2 = DSQL_CreateHandle();
result4_2 = DSQL_RunQuery(iHandle4_2, sstr4_2);
DSQL_BindCol(iHandle4_2, 2, 'double');
iHandle4_2 =DSQL_DeleteHandle();
Но ничего не происходит, ошибок нет, но поле не изменяется.
Если такой же запрос сделать в TOAD, то все работает, поле меняется, т.е. функция updtkatbox вроде как пашет.
Что может быть не так ( все запускается из JS!)?
Re: Прямой SQL
Добавлено: 10 авг 2012, 19:21
spark
savov писал(а):Den писал(а):Это баг быстрее всего.
Галактика зарегистрировала это в ПИР.
Но мне их ждать долго.
Попробовал обходной маневр.
В oracle написал функцию изменения поля:
Код: Выделить всё
CREATE OR REPLACE FUNCTION updtkatbox(NRECREC IN VARCHAR2, MAXC IN NUMBER)
RETURN INTEGER
IS
procedure UPDKATBOX_PR is
pragma autonomous_transaction;
begin
UPDATE VRN.KATBOX SET FCOUNT=MAXC WHERE FNREC=NRECREC;
COMMIT;
END;
begin
UPDKATBOX_pr;
return 1;
END;
В Галактике пытаюсь сделать:
Код: Выделить всё
sstr4_2='select updtkatbox(#comp('+nreckatbox+'),'+AllInPallet_Alg+') from dual';
Message(sstr4_2,0);
iHandle4_2 = DSQL_CreateHandle();
result4_2 = DSQL_RunQuery(iHandle4_2, sstr4_2);
DSQL_BindCol(iHandle4_2, 2, 'double');
iHandle4_2 =DSQL_DeleteHandle();
Но ничего не происходит, ошибок нет, но поле не изменяется.
Если такой же запрос сделать в TOAD, то все работает, поле меняется, т.е. функция updtkatbox вроде как пашет.
Что может быть не так ( все запускается из JS!)?
Функцию(процедуру) ж вроде средствами атлантиса надо создать.
с помощью aSQL.exe запустить lot, в котором:
Код: Выделить всё
sql procedure updtkatbox(NRECREC : comp; MAXC :integer);
{
}
а потом уже средствами оракла написать в нее содержимое. иначе атлантис ее не воспринимает. Или я КО в данном случае? =))
Re: Прямой SQL
Добавлено: 28 авг 2012, 08:34
Шевцов Владимир
Перепробовал кучу вариантов, не могу вернуть значение OUT параметра процедуры.
Код вызова:
Код: Выделить всё
nSTMT := sqlAllocStmt;
sqlBindParam(nSTMT, 1, _1_3_all);
sqlPrepare(nSTMT,'GET_SSPIS2('''+DateToStr(date11,'YYYY-MM-DD')+''','''+DateToStr(date22,'YYYY-MM-DD')+''',0,0,0,?)');
sqlExecute(nSTMT);
Результат ORA90DRV.LOG:
Код: Выделить всё
28.08.2012 13:22:01 [SHEVTSOVVA]:
BEGIN GALNPK."S$GET_SSPIS2" ( '2012-01-01' , '2012-03-31' , 0 , 0 , 0 , :P1 ) ;END;
ORA-01843: not a valid month
ORA-06512: at "GALNPK.S$GET_SSPIS2", line 149
ORA-06512: at line 1
---Bind variable values---
:P1 0
--------------------------
Вызов той же процедуры в PL/SQL:
Код: Выделить всё
DECLARE COL1 INTEGER;
BEGIN
GALNPK.S$GET_SSPIS2('2012-01-01','2012-03-31',0,0,0,COL1);
DBMS_OUTPUT.enable;
DBMS_OUTPUT.put_line('SSPIS = '||TO_CHAR(COL1));
END;
Результат выполнения PL/SQL:
Почему не работает из Галактики что не так делаю?
Re: Прямой SQL
Добавлено: 28 авг 2012, 11:39
Den
Вообще вызов скалярной функции в dsql для получения просто какого то значения обратно "со своими прибабахами" ))
Нет возможности сейчас потестить на оракле, но под мсскуль работает вот так(по идее и под оракла должно тоже) на простом примере:
Код: Выделить всё
SQL Function GetKontrByMaxNrec (): comp;
var
res : comp;
{
res:=(Select max(nrec) from katorg);
return res;
}
Interface test_call_fun;
create view
var c: comp;
stmt : longint;
;
handleevent
CmInit:{
sqlFreeStmt(stmt);
stmt := sqlAllocStmt;
sqlBindCol(stmt, 1, c);
SqlExecStmt(stmt,'select top 1 getKontrByMaxNrec () from abonents');
if sqlFetch(stmt) = tsOk
Message('c='+c);
}
end;
end.
Отличительной особенностью является, как я понял, наличие в запросе top 1 +секция from...причем по барабану из какой таблицы )) Иначе выкидывает в ошибку такой запрос Атлантис.
Что касается Вашего случая, то не уверен что можно вызывать процедуры с параметром out из dsql. по крайней мере в доке как кто об этом не сказано.
Попробуйте оформить Вашу процедуру в функцию с параметрами может...
Re: Прямой SQL
Добавлено: 28 авг 2012, 18:01
savov
spark писал(а):с помощью aSQL.exe запустить lot, в котором:
А из support это не прокатит?
Попробовал запустить asql с конфигурационным файлом от support, но ничего не получилось, ошибка соединения с БД и открытия словаря.
Для oracle может подскажете как asql запустить?
Re: Прямой SQL
Добавлено: 29 авг 2012, 05:28
Шевцов Владимир
savov писал(а):Для oracle может подскажете как asql запустить?
Я создавал процедуру из ASQL - проблем с запуском не возникло, cfg простейший, и по-моему он автоматически сгенерирован, например что там за пасворд указан не знаю, запрашивает имя и пароль при запуске:
Код: Выделить всё
[DataBase]
DataBaseName=GALNPK
DataBaseDriver=ORA90DRV.DLL
[SQLDriver]
SQLServer=GALNPK
FullLoginName=FALSE
[Login]
UserName=
Password=ХХХХХХХ
Re: Прямой SQL
Добавлено: 29 авг 2012, 13:20
savov
Шевцов Владимир писал(а):Я создавал процедуру из ASQL - проблем с запуском не возникло, cfg простейший, и по-моему он автоматически сгенерирован, например что там за пасворд указан не знаю, запрашивает имя и пароль при запуске:
Попробовал, почему-то не получается, нет соединения с БД пишет.
А из обычного SQL в саппорте почему нельзя?
У меня из обычного суппорта создалась запись в X$RESOURCES, в базе создалась пустая функция, но имя у нее S$UPKATBOX, хотя задавал имя UPKATBOX.
Ораклом изменил ее код, но из Галактики все равно не работает.
Re: Прямой SQL
Добавлено: 29 авг 2012, 14:14
spark
savov писал(а):Шевцов Владимир писал(а):Я создавал процедуру из ASQL - проблем с запуском не возникло, cfg простейший, и по-моему он автоматически сгенерирован, например что там за пасворд указан не знаю, запрашивает имя и пароль при запуске:
Попробовал, почему-то не получается, нет соединения с БД пишет.
А из обычного SQL в саппорте почему нельзя?
У меня из обычного суппорта создалась запись в X$RESOURCES, в базе создалась пустая функция, но имя у нее S$UPKATBOX, хотя задавал имя UPKATBOX.
Ораклом изменил ее код, но из Галактики все равно не работает.
Из саппорта можно, я так делал. Имя правильное, галактика должна с ней работать по имени UPKATBOX. S$ драйвер добавляет сам...
Re: Прямой SQL
Добавлено: 29 авг 2012, 15:31
savov
spark писал(а):Из саппорта можно, я так делал. Имя правильное, галактика должна с ней работать по имени UPKATBOX. S$ драйвер добавляет сам...
Тогда я туплю или уж не знаю что.
По шагам.
1. Сделал из суппорта sql:
Код: Выделить всё
sql function upkatbox(NRECREC : comp; MAXC :integer): Integer;
{};
2. Получил в Оракле функцию с именем S$Upkatbox.
3. Средствами TOAD изменил функцию:
Код: Выделить всё
CREATE OR REPLACE FUNCTION "S$UPKATBOX"(NRECREC IN VARCHAR2, MAXC IN NUMBER) RETURN NUMBER IS
procedure UPDKATBOX_PR is
pragma autonomous_transaction;
begin
UPDATE VRN.KATBOX SET FCOUNT=MAXC WHERE FNREC=NRECREC;
COMMIT;
END;
BEGIN
UPDKATBOX_PR;
RETURN 1;
END;
4. Пробую в JS запустить:
Код: Выделить всё
//вставляем максимальное число по палетте в каталог инфраструктуры склада
sstr4_2='select UPKATBOX(#comp('+nreckatbox+'),'+AllInPallet_Alg+') from dual';
iHandle4_2 = DSQL_CreateHandle();
result4_2 = DSQL_RunQuery(iHandle4_2, sstr4_2);
DSQL_BindCol(iHandle4_2, 1, 'double');
Message(DSQL_GetFieldValueByNum(1));
iHandle4_2 =DSQL_DeleteHandle();
НЕ РАБОТАЕТ!!!
Есть идеи о том, где косяк?
PS.
Если запускаю функцию в TOAD с нужным нреком, то все работает.
Re: Прямой SQL
Добавлено: 03 сен 2012, 11:41
Шевцов Владимир
Den писал(а):Вообще вызов скалярной функции в dsql для получения просто какого то значения обратно "со своими прибабахами" ))
Нет возможности сейчас потестить на оракле, но под мсскуль работает вот так(по идее и под оракла должно тоже) на простом примере:
Отличительной особенностью является, как я понял, наличие в запросе top 1 +секция from...причем по барабану из какой таблицы )) Иначе выкидывает в ошибку такой запрос Атлантис.
Что касается Вашего случая, то не уверен что можно вызывать процедуры с параметром out из dsql. по крайней мере в доке как кто об этом не сказано.
Попробуйте оформить Вашу процедуру в функцию с параметрами может...
Спасибо за подсказку. Ошибка, которая у меня была оказалась несвязана с выходными/входными параметрами процедуры. Проблема была в том что при запуске хранимки из галактики дата предаваемая в функцию TO_ATLDATE в виде строки не переводилась корректно в DATETIME. Из-под ораклового клиента всё работало. Добавление явного преобразования помогло.
Есть еще затруднение:
Вместо указания любой таблицы и ограничения по количеству выводимых записей - для запуска функции хотелось бы использовать рекомендуемую таблицу SYS.DUAL.
Как указать другую схему в прямом SQL?
На стандартный синтаксис (СХЕМА.ТАБЛИЦА) вот что пишет:
Код: Выделить всё
03.09.2012 12:24:26 [SHEVTSOVVA]:
Ошибка (1,65): Синтаксическая ошибка в SQL запросе "."
03.09.2012 12:26:08 [SHEVTSOVVA]:
Select GET_SSPIS('2012-01-01','2012-03-31',0,0,0) from SYS.DUAL
Re: Прямой SQL
Добавлено: 03 сен 2012, 11:46
savov
А по моей проблеме есть мысли, товарищи спецы?