powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Можно ли в Cache создать хранимую процедуру, которая возвращает более одного значения?
4 сообщений из 4, страница 1 из 1
Можно ли в Cache создать хранимую процедуру, которая возвращает более одного значения?
    #35694287
Erick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли в Cache создать хранимую процедуру, которая возвращает более одного значения?
Код: plaintext
1.
2.
ClassMethod ProcName() As %Type [SqlProc] // возвращает одно значение
Query QueryName() As %Query(CONTAINID =  1 , ROWSPEC = "Title:%String,Author:%String") //может много, но код только SQL, а мне нужен COS

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

Хранимую процедуру принято вызывать ИмяТаблицы_ИмяПроцедуры() в каких либо запросах и собсно одно возращаемое значение тут вполне логично...

Запросы (Query) же так не вызовешь - нужно формировать %ResultSet открывать запрос и в цикле получать значения...

Хотя есть вариант вызова через call ИмяТаблицы_ИмяПроцедуры() - но беда в том что call работает только в ODBC (вроде как - если неправ пусть меня поправять)

Но тем не менее Query основанный на COS писать можно - объясняю как

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
// Описываете сам запрос
Query QueryName(p1,p2,p3) As %Query(CONTAINID =  1 , ROWSPEC = "Title:%String,Author:%String")
{
// тут как не странно пусто
}

// Описываем метод который будет обрабатывать событие Execute
ClassMethod QueryNameExecute(ByRef qHandle As %Binary, p1,p2,p3) As %Status
{
 // qHandle - многомерная переменная которая передается во все методы
 // через нее можно передовать параметры, запоминать выбранную строку
 // и даже хранить результат если они разумного объема

 // p1,p2,p3 - параметры запроса

 // Вы этом методе вы собсно и выполняете выборку (хотя можно по разному)
 quit $$$OK
}

// Описываем метод который будет обрабатывать событие получения одной строки
ClassMethod QueryNameFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer =  0 ) As %Status
{
 // qHandle - таже многомерная переменная что и в Execute

 // Row - собственно строка которую нужно вернуть - это список соотвесвующий ROWSPEC
 // То есть $LB(Title,Author)

 // AtEnd признак конца выборки - устанавливаете  1 -цу когда строки кончились

 // Тут из формируете в Row строку ответа, крутите счетчик строк и т.д.
 quit $$$OK
}

// Описываем метод который будет обрабатывать событие закрытия запроса
ClassMethod QueryNameClose(ByRef qHandle As %Binary) As %Status
{
 // qHandle - таже многомерная переменная что и в Execute и Fetch

 // Тут производите чистку временных массивов, qHandle или просто ничего не делаете
 quit $$$OK
}
...
Рейтинг: 0 / 0
Можно ли в Cache создать хранимую процедуру, которая возвращает более одного значения?
    #35694631
Erick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, похоже то что мне нужно.
Спасибо, буду разбираться.
...
Рейтинг: 0 / 0
Можно ли в Cache создать хранимую процедуру, которая возвращает более одного значения?
    #35694697
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример:
Код: 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.
33.
34.
35.
Query testquery(count As %Integer) As %Query(ROWSPEC = "id:%String,name:%String") [ SqlProc ]
{
}

ClassMethod testqueryExecute(
  ByRef qHandle As %Binary,
  count As %Integer) As %Status
{
  set qHandle=$lb( 0 ,count)
  Quit $$$OK
}

ClassMethod testqueryFetch(
  ByRef qHandle As %Binary,
  ByRef Row As %List,
  ByRef AtEnd As %Integer =  0 ) As %Status [ PlaceAfter = testqueryExecute ]
{
  set Row=""
  set id=$li(qHandle, 1 )+ 1 

  if id>$li(qHandle, 2 ) {
    set AtEnd= 1 
  }
  else {
  set name="name="_id
  set Row=$lb(id,name)
  set $li(qHandle, 1 )=id
  }
  Quit $$$OK
}

ClassMethod testqueryClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = testqueryExecute ]
{
  Quit $$$OK
}
Запустить для проверки можно, например, из портала:
Код: plaintext
 [Домашняя страница] > [SQL] > [Схемы] > [Хранимые процедуры] > [Запустить Запрос] 

Еще есть возможность возвращать в одном запросе более одной таблицы (вызывал из .NET-клиента):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Include %occResultSet

Class dotNet.Contact Extends (%Persistent, %Populate, %XML.Adaptor)
{

Property Name As %String;

Property DOB As %Date;

ClassMethod MRS() As %Integer [ ReturnResultsets, SqlProc ]
{
  $$$ResultSet("select ID,Name,DOB from dotNet.Contact")
  $$$ResultSet("select ID,Name from dotNet.Contact")
  $$$ResultSet("select ID from dotNet.Contact")
  $$$ResultSet("select * from dotNet.Contact")
  quit  0 
}

}
или так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Class DynamicSQL.Sample Extends %Persistent
{

ClassMethod Test(
  SelectList As %String,
  FromList As %String,
  WhereList As %String) As %ResultSet.SQLQuery [ ReturnResultsets, SqlName = Test, SqlProc ]
{
	
  s sql="SELECT "
  s sql=sql_SelectList
  s sql=sql_" FROM "_FromList
  if $g(WhereList)'="" s sql=sql_" WHERE "_WhereList
  s ^bjb=sql
  set rs = ##class(%ResultSet.SQL).%Prepare(sql,.returnError)
  i returnError'="" QUIT ""
  if $isobject($Get(%sqlcontext)) { do %sqlcontext.AddResultSet(rs) }
  Quit rs
}

}

Примеры взяты из Caché and Ensemble Code Samples .
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Можно ли в Cache создать хранимую процедуру, которая возвращает более одного значения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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