Intersystems Cache: Embed SQL всегда возвращает только первую строку
Я скопировал код с оф. документация:
&sql(SELECT *,%ID INTO :tflds()
FROM Sample.Person )
IF SQLCODE=0 {
SET firstflds=14
FOR i=0:1:firstflds {
IF $DATA(tflds(i)) {
WRITE "field ",i," = ",tflds(i),! }
} }
ELSE {WRITE "SQLCODE error=",SQLCODE,! }
Но по какой-то причине он возвращает только все поля первого ряда и ничего больше. Это ошибка или я что-то делаю неправильно?
2 ответа
Решение
Вам нужно использовать курсор для циклического прохождения строк результата SQL-запроса.
&sql(declare c1 cursor for SELECT *,%ID INTO :tflds()
FROM Sample.Person)
&sql(open c1)
for {
&sql(fetch c1)
quit:SQLCODE'=0
set firstflds=14
for i=0:1:firstflds {
if $Data(tflds(i)) {
write "field ",i," = ",tflds(i),!
}
}
write "===NEXT ROW===",!
}
&sql(close c1)
См. http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_esql#GSQL_esql_cursor для получения дополнительной информации.
Встроенный SQL является хорошим инструментом для операций, чувствительных к производительности, но с ним действительно трудно справиться, если вам нужно извлечь более одной строки. Весь этот бизнес курсора - боль.
Попробуйте вместо этого использовать динамический SQL. У него хороший интерфейс, похожий на набор результатов.