Страница 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:

Код: Выделить всё

SSPIS = 876
Почему не работает из Галактики что не так делаю?

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
А по моей проблеме есть мысли, товарищи спецы?