Прямой SQL

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

А если так?

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

...
tmpstr="update katbox set katbox.count="+AllInPallet+" where katbox.nrec=";
sstr4_1=tmpstr+#comp("+nreckatbox+")";
...
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

Та же ошибка.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

RAJAH писал(а):А если так?

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

...
tmpstr="update katbox set katbox.count="+AllInPallet+" where katbox.nrec=";
sstr4_1=tmpstr+#comp("+nreckatbox+")";
...
Та же ошибка ( см. выше)
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение 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 сделано неключевым
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение 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!)?
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: Прямой SQL

Сообщение 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);
{  

}
а потом уже средствами оракла написать в нее содержимое. иначе атлантис ее не воспринимает. Или я КО в данном случае? =))
Шевцов Владимир
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 09 окт 2009, 11:58
Откуда: г.Находка

Re: Прямой SQL

Сообщение Шевцов Владимир »

Перепробовал кучу вариантов, не могу вернуть значение 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
Почему не работает из Галактики что не так делаю?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение 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. по крайней мере в доке как кто об этом не сказано.
Попробуйте оформить Вашу процедуру в функцию с параметрами может...
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

spark писал(а):с помощью aSQL.exe запустить lot, в котором:
А из support это не прокатит?
Попробовал запустить asql с конфигурационным файлом от support, но ничего не получилось, ошибка соединения с БД и открытия словаря.
Для oracle может подскажете как asql запустить?
Шевцов Владимир
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 09 окт 2009, 11:58
Откуда: г.Находка

Re: Прямой SQL

Сообщение Шевцов Владимир »

savov писал(а):Для oracle может подскажете как asql запустить?
Я создавал процедуру из ASQL - проблем с запуском не возникло, cfg простейший, и по-моему он автоматически сгенерирован, например что там за пасворд указан не знаю, запрашивает имя и пароль при запуске:

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

[DataBase]
 DataBaseName=GALNPK
 DataBaseDriver=ORA90DRV.DLL
[SQLDriver]
 SQLServer=GALNPK
 FullLoginName=FALSE
[Login]
 UserName=
 Password=ХХХХХХХ
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

Шевцов Владимир писал(а):Я создавал процедуру из ASQL - проблем с запуском не возникло, cfg простейший, и по-моему он автоматически сгенерирован, например что там за пасворд указан не знаю, запрашивает имя и пароль при запуске:
Попробовал, почему-то не получается, нет соединения с БД пишет.

А из обычного SQL в саппорте почему нельзя?
У меня из обычного суппорта создалась запись в X$RESOURCES, в базе создалась пустая функция, но имя у нее S$UPKATBOX, хотя задавал имя UPKATBOX.
Ораклом изменил ее код, но из Галактики все равно не работает.
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: Прямой SQL

Сообщение spark »

savov писал(а):
Шевцов Владимир писал(а):Я создавал процедуру из ASQL - проблем с запуском не возникло, cfg простейший, и по-моему он автоматически сгенерирован, например что там за пасворд указан не знаю, запрашивает имя и пароль при запуске:
Попробовал, почему-то не получается, нет соединения с БД пишет.

А из обычного SQL в саппорте почему нельзя?
У меня из обычного суппорта создалась запись в X$RESOURCES, в базе создалась пустая функция, но имя у нее S$UPKATBOX, хотя задавал имя UPKATBOX.
Ораклом изменил ее код, но из Галактики все равно не работает.
Из саппорта можно, я так делал. Имя правильное, галактика должна с ней работать по имени UPKATBOX. S$ драйвер добавляет сам...
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение 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 с нужным нреком, то все работает.
Шевцов Владимир
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 09 окт 2009, 11:58
Откуда: г.Находка

Re: Прямой SQL

Сообщение Шевцов Владимир »

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 
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

А по моей проблеме есть мысли, товарищи спецы?
Ответить