powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Построчное извлечение данных из курсора
25 сообщений из 28, страница 1 из 2
Построчное извлечение данных из курсора
    #34630091
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый субботний день:)
Подскажите, пожалуйста, есть ли в Cache тип данных - строка (в Oracle %RowType) или что-то в этом духе для построчного извлечения данных из курсора?
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34630125
FenderJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка то есть , только вот курсора к сожалению нет
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34630377
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот например есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
&sql( declare pCur cursor for
select reg.id, reg.date_change, reg.id_locations, loc.long_name, loc.dme_code, reg.regime, reg.status, vs.tys, vs.gsm
from reglament reg, locations loc, vs
where reg.id_locations=loc.id and
vs.id_reglament=reg.id
)

Теперь мне надо извлечь из курсора информацию и вывести на экран
Код: plaintext
1.
2.
3.
4.
5.
&sql(open pCur)
for { &sql(fetch pCur into ***)
write ***
quit:sqlcode
}

что можно поставить вместо *** , чтобы не создавать на каждое поле отдельную переменную?
Можно конечно массив, но чето не хочется...
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34630842
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sonia >>Можно конечно массив, но чето не хочется...

Отчего же ? В М что массив что переменная всё одно... единственно что следует позоботится о доступе к пустым индексам

На первый взгляд есть как миним два способа.

Первый прямой
Код: plaintext
&sql(fetch pCur into :row() )

чреват тем что - индексы в соданном массиве row - будут прямо говоря неудобны, и непоследовательны

Второй обходный - это отказ от статического курсора и использования динамического %ReslutSet
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
new rs
set rs=##class(%ResulSet).New()
do rs.Prepare("select reg.id, reg.date_change, reg.id_locations, loc.long_name,
 loc.dme_code, reg.regime, reg.status, vs.tys, vs.gsm
from reglament reg, locations loc, vs where reg.id_locations=loc.id and vs.id_reglament=reg.id")
do rs.Execute()
while rs.Next() {
#; массив по именам колонок для одной строки
zw rs.Data
w rs.GetData( 1 ),rs.GetData( 2 ),!
}
set rs=""

Но учитывая все - все это таки легче использовать массив

Код: plaintext
1.
&sql(fetch pCur into :row("regid"),:row("chgdate"),:row("location"),:row("name"),:row("dme"),
:row("regtime"),:row("status"),:row("tys"),:row("gsm") )
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631153
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамический вродебы проигрывает по скорости статическому...

Для автора.
Если есть огромное желание запихать все в одну переменную для последующего "разбора"... Нужно изменить тип вывода полей, предварительно склеив их. Правда на моей версии конкатенация работает только с полями... Если втавить между ними разделитель получаются просто пустые строки
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631351
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проигрывает ... но IMXO незначительно.

Зато при тюнинге, или смене структур используемых таблиц нет нужды переписывать( перекомпилировать) программу - и можно подключать самописные процедуры.
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631455
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам-то я не замерял скоростЯ Это из информации от IS...

Но стало интересно. Какие изменения в классе могут повлечь перекомпилирование программы с макросом
Код: plaintext
&sql()
Может кто знает?

А конкатенация в SQL у кого-то работает?
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631533
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает, если нет пустых (null) строк.
Строки соединяем командой string()

Кстати, в SQL можно использовать и команды M, например "_". Ограничения не помню, не всегда.
Говорю по памяти, специально экспериментов не ставил.
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631547
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я замеры производил - признал их малозначимыми - с оглядкой конечно как и что писать.

Без перекомпилирования &SQL на него не окажут эффектов, введение новых индексов, настройка селективности как вручную так и через TuneTable, и так же не изменится код для вычислимых полей

А изменение структуры таблиц, подтаблиц для &SQL смертельно - переход с одной версии каше на другую как правило то же.
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631589
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.в SQL можно использовать и команды M, например "_".
Не-е-е... :( Эту использовать в SQL нельзя... Вместо нее "||" используются... Но как-то странно :)
Код: plaintext
1.
2.
select
a||b
...
работает.
Код: plaintext
1.
2.
select
a||"-"||b
...
выдает пустые строки... :(
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631670
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaНе-е-е... :( Эту использовать в SQL нельзя... Вместо нее "||" используются... Но как-то странно :)

Почему же?
Вот, только что попробовал - все ОК.
Только скобки нужно ставить или проблемы, иначе оно пытается найти такое имя поля

Попробовал
1.A _ "-" _ B
2.{fn concat({fn concat (A,"-")},B)}
3.string(A,"-",B)
4.A||"-"||B
Все получилось

Пробовал в портале управления
Cache for Windows (Intel) 5.2 (Build 329) Thu Jun 15 2006 16:40:08 EDT
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631727
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...или пробелы...

проблемы - это не сюда :-)
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631914
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Cache for Windows (Intel) 5.2 (Build 329) Thu Jun 15 2006 16:40:08 EDT
Может в этом-то все и дело?
Сейчас пробовал и с "_" и с пробелами... Работает только с полями :( При использовании строковых констант выдает пустые строки...
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34631943
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что работает
Код: plaintext
1.
2.
select
string(a,"-",b,"-",c)
...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34632791
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FenderJBСтрока то есть , только вот курсора к сожалению нет

Курсор в Cache' есть.
Стоит почитать документацию по SQL в Cache' .
Там есть и готовые примеры по работе с курсорами.

С уважением, Вадим
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34637237
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ptn
Но учитывая все - все это таки легче использовать массив

Код: plaintext
1.
&sql(fetch pCur into :row("regid"),:row("chgdate"),:row("location"),:row("name"),:row("dme"),
:row("regtime"),:row("status"),:row("tys"),:row("gsm") )


Так и сделаем:) Спасибо!
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638218
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И повторно я возвращаюсь к этому вопросу....
Есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CreateForm() public{
	
	&sql(
	declare pCur cursor for 
	select reg.id, 
  reg.id_locations,
  reg.date_change,
  loc.icao_code_cyr,
  loc.long_name_cyr, 
  vs.time_fly, 
  vs.tys,
  vs.gsm, 
  reg.status, 
  loc.dme_code,
  reg.season, 
  reg.regime
  from mpopova.reglament reg, aodb.locations loc, mpopova.vs
  where loc.appn_row_id=reg.id_locations and 
  vs.id_reglam=reg.id 
  order by long_name_cyr
   )
  &sql(Open pCur)
  for {
  &sql(fetch pCur into :row(id), :row(id_loc), :row(dt_ch), :row(icao), :row(name),
  :row(time_fly), :row(tys), :row(gsm), :row(stat), :row(dme), :row(seas), :row(regime))
  write row(id),"-",row(id_loc),"-",row(dt_ch),"-",row(icao),"-", row(name),"-",
  row(time_fly),"-",row(tys),"-", row(gsm),"-",row(stat),"-",row(dme),"-", row(seas),"-", 
  row(regime),"-",!
  quit:sqlcode
  }
	
}

При выполнении программы: do ^CreateForm
пишет ошибку где-то в районе считывания курсора и вывода значений на экран.

s row(id)=%pCur0d(1),row(id_loc)=%pCur0d(2),row(dt_ch)=%pCur0d(3),row(icao)=%pC
^
ur0d(4),row(name)=%pCur0d(5),row(time_fly)=%pCur0d(6),row(tys)=%pCur0d(7),row(gs
m)=%pCur0d(8),row(stat)=%pCur0d(9),row(dme)=%pCur0d(10),row(seas)=%pCur0d(11),ro
w(regime)=%pCur0d(12)
<UNDEFINED>%0Do+1^CreateForm *id


Что не так????
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638312
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не
Код: plaintext
1.
row(dme)
а
Код: plaintext
1.
row("dme")
,
Не
Код: plaintext
1.
  quit:sqlcode
а
Код: plaintext
1.
2.
 #: SQLCODE - заглавными буквами
  quit:SQLCODE'= 0  

QUIT должен быть сразу после FETCH - помещение между ними WRITE - ошибка.

В конце процедуры нет команды закрытия курсора - видимо не скопировался просто
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638378
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй
Код: plaintext
string(a,"-",b,"-",c)
Век воли не видать!
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
Код: plaintext
string(a,"-",b,"-",c)
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638448
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PtnНе
Код: plaintext
1.
row(dme)
а
Код: plaintext
1.
row("dme")
,
Не
Код: plaintext
1.
  quit:sqlcode
а
Код: plaintext
1.
2.
 #: SQLCODE - заглавными буквами
  quit:SQLCODE'= 0  

QUIT должен быть сразу после FETCH - помещение между ними WRITE - ошибка.

В конце процедуры нет команды закрытия курсора - видимо не скопировался просто

А почему тогда компилятор пропустил row(dme)??
Почему нельзя ставить помещение между quit и fetch - write есть ошибка?
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638460
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А кстати quit:SQLCODE - прям так было написано в учебнике!
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638569
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так как значение "ВСЕ ХОРОШО" соотвествуют SQLCODE=0 то по идее работать для постусловий будет, если за истинное принимается значение отличное от нуля.

Я предпочитаю явно указывать условие - мало ли что завтра в компиляторе поменяют.

ЗЫ: но SQLCODE на sqlcode заменить все равно надо.
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638573
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть наоборот slqcode на SQLCODE
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638643
Sonia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заменила, все равно та же ошибка:(
...
Рейтинг: 0 / 0
Построчное извлечение данных из курсора
    #34638745
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
например, в строке
Код: plaintext
&sql(fetch pCur into :row(id), :row(id_loc), :row(dt_ch), :row(icao), :row(name),

заменить
Код: plaintext
row(id)
на
Код: plaintext
row("id")
и так далее по тексту, т.к. переменные id, id_loc и т.д. не определены.


<UNDEFINED>%0Do+1^CreateForm *id - в ошибке явно указано на неопределенную переменную id.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Построчное извлечение данных из курсора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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