powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / embeded SQL & MAC : underfined variables
21 сообщений из 21, страница 1 из 1
embeded SQL & MAC : underfined variables
    #38609637
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую сделать процедуру в *.MAC (классы не используются) версия Cache 5.0.21.6408.0 :uploadData()PUBLIC
{
 &sql(DECLARE SrCur CURSOR
 FOR SELECT tab1.Code,tab2.Gruppe,tab1.Langname
 INTO :srID, :srGroup, :srName
 FROM SQLUser.tab1, SQLUser.tab2
 WHERE tab1.Code =* tab2.Code)
 &sql(OPEN SrCur)
 for {
 &sql(FETCH SrCur)
 Quit:SQLCODE

 W srID_";"_srGroup_";"_srName_";",! 
 }
 &sql(CLOSE SrCur)
}
Возвращает:
Quit:SQLCODE
^
<UNDEFINED>

если сделать s SQLCODE=0 возвращает:

W srID_";"_srGroup_";"_srName_";",!
^
<UNDEFINED>

Что не так делаю?
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609693
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutЧто не так делаю?
Начнем с того, что просто так выходить при объявленом курсоре не стоит...
Полный пример выглядит так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 &sql(DECLARE C1 CURSOR FOR
    SELECT %ID,Name
    INTO :id, :name
    FROM Sample.Person
    ORDER BY Name
 )

 &sql(OPEN C1)
 &sql(FETCH C1)

 While (SQLCODE = 0) {
     Write id, ":  ", name,!        
    &sql(FETCH C1)
 }
    
 &sql(CLOSE C1)


Т.е. если есть объявление курсора - должно быть и закрытие...
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609700
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakut , программка-то вообще компилится у тебя?

Проверь сам запрос...

Код: javascript
1.
2.
 &sql(SELECT ...)
 WRITE "The SQL error code is ",SQLCODE,!
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609778
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaНачнем с того, что просто так выходить при объявленом курсоре не стоит...Можно и так и эдак : стиль написания цикла каждый выбирает под свои нужды.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609807
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakut,

Суть в том, что выполнение запроса - это другая программа,а скобки, обрамляющие процедуру означают, что область видимости переменных - только эта программа. Такой аналог процедуреблочности для МАС. Но в процедуреблочных классах компилятор встречая хост-переменные в запросах объявляет их публичными и делает для них операцию new. Вам придется это делать вручную. Вообще, я бы не советовал использовать {} для обрамления тела программы, проблем создает гораздо больше, чем решает.

В общем, решений несколько:
1. Сделать переменные, использующиеся в запросах, публичными, а потом внутри программы сделать им new
2. Отказаться от изоляции переменных и делать new всем переменным, кроме параметров процедуры
3. Отказаться от EmbedSQL, попробовать сделать все на динамических запросах.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609818
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У маков плюсов немного
1) проще компилить на работающей системе.
2) проще писать программы с переключением областей.
А вот с видимостью переменных полный абзац.

По этой причине, кстати, я категорически не рекомендую МАС для разработки чего-то более-менее многоразового. Только разовые программки для исправления данных и системные программы.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609828
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitМожно и так и эдак : стиль написания цикла каждый выбирает под свои нужды.
Я не про "стиль написания цикла" а про выход без закрытия курсора...
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609836
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaЯ не про "стиль написания цикла" а про выход без закрытия курсора...Посмотрите внимательнее код (предпоследняя строчка)
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609889
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitПосмотрите внимательнее код (предпоследняя строчка)
Если ты про код ТСа - так там выход есть ранее закрытия курсора...
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609902
AlexShiryaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

Это выход не их процедуры, а из цикла for.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609903
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaЕсли ты про код ТСа - так там выход есть ранее закрытия курсора ...Выход из бесконечного цикла, но не из программы. Пример ТС один в один взят из документации.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609925
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит глаза уже подводят...
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609972
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.,

1) как сделать переменные публичными? покажите пожалуйста пример кода

2) Отказаться от изоляции переменных и делать new всем переменным, кроме параметров процедуры

3) Отказаться от EmbedSQL, попробовать сделать все на динамических запросах.
буду благодарен за пример кода

И как будет выглядеть программа на INC ?
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38609998
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отвечаю на свой первый вопрос:

публичные переменные задаются в квадратных скобках:

MyProc(privateVar1) [publicVar1] PUBLIC
{
...
}

PUBLIC - это инструкция для процедуры, но не для переменных.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610020
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakut3) Отказаться от EmbedSQL, попробовать сделать все на динамических запросах.
Использовать вот это ...
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610021
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutИ как будет выглядеть программа на INC ?
Да так же, как и mac, только без препроцессорных команд...
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610028
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutотвечаю на свой первый вопрос:

публичные переменные задаются в квадратных скобках:

Код: javascript
1.
2.
3.
4.
MyProc(privateVar1) [publicVar1] PUBLIC
{
 ...
}



PUBLIC - это инструкция для процедуры, но не для переменных.
Либо использовать "старый" синтаксис...

Код: javascript
1.
2.
3.
MyProc
   new val1,val2
   q
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610042
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,
спасибо, вы как всегда показатель оперативности и содержательности ответов
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610213
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutИ как будет выглядеть программа на INC ?
krvsaДа так же, как и mac, только без препроцессорных команд...
Только, наверное, имелось в виду не INC, а INT :)
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610431
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakut ,

Host Variables and Procedure Blocks (в документации 5.0.21 поищите Caché SQL Reference -> Host variable)
Соответственно пример кода test.mac для версии 5.0.21:  new id,name,SQLCODE,%ROWCOUNT,%ROWID
  &sql(declare c1 cursor for select %ID, Name from Sample.Person where %ID in (1,2,3))
  &sql(open c1)
  for  {
    &sql(fetch c1 into :id,:name)
    quit:SQLCODE
    write id," ",name,!
  }
  &sql(close c1)

test2() [id, name, SQLCODE] public {
  new id,name,SQLCODE,%ROWCOUNT,%ROWID
  &sql(declare c2 cursor for select %ID, Name from Sample.Person where %ID in (1,2,3))
  &sql(open c2)
  for  {
    &sql(fetch c2 into :id,:name)
    quit:SQLCODE
    write id," ",name,!
  }
  &sql(close c2)
}

test3() [SQLCODE,extinfo,sc] public {
  new SQLCODE,extinfo,sc,%ROWCOUNT,%ROWID
  set rs=##class(%ResultSet).%New("%DynamicQuery:SQL")
  do rs.Prepare("select %ID, Name from Sample.Person where %ID in (1,2,3)")
  do rs.Execute()
  while rs.Next() {
    write rs.Get("ID")," ",rs.Get("Name"),!  
  }
  do rs.Close()
}Все три варианта

Код: plaintext
1.
2.
SAMPLES>do ^test
SAMPLES>do test2^test()
SAMPLES>do test3^test()

выдают одинаковый результат.

После каждого вызова можно проверить все ли мы защищаем за собой переменные, вызвав write без аргументов: если что-то будет - повод задуматься.
...
Рейтинг: 0 / 0
embeded SQL & MAC : underfined variables
    #38610840
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

Большое спасибо за пример кода. Буду пробовать.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / embeded SQL & MAC : underfined variables
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]