Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %ResultSet.SQL / 24 сообщений из 24, страница 1 из 1
21.02.2010, 23:50
    #36482455
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Продублирую вопрос сюда, чтобы не было лишнего офтопика
В одной из тем упомянуто, что можно не только с %Library.ResultSet делать динамические запросы.
А можно какой-нибудь пример, а то по документации ничего не понял (да ее и мало там на эту тему).
И чем лучше %ResultSet.SQL чем %Library.ResultSet?
Мне показалось, что он выгружает сразу все строки запроса в глобал, и за счет отказа от вызова .Next получаем прирост скорости?
...
Рейтинг: 0 / 0
22.02.2010, 06:10
    #36482531
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Блок А.Н.,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		s sql = "SELECT ID FROM a.test"
		s result = ##class(%ResultSet.SQL).%Prepare(.sql,.err,"")
		if '$ISOBJECT(err) {
			while result.%Next() {
				w "data: ",result.%Get("ID"),!
			}
		}

Про то, "чем лучше", не знаю... но на паре тестов у меня работает значительно быстрее.
Как устроен "внутри" тоже не подскажу.
...
Рейтинг: 0 / 0
22.02.2010, 07:03
    #36482544
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Спасибо :-)
...
Рейтинг: 0 / 0
22.02.2010, 11:02
    #36482655
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Блок А.Н., из того же топика:

KSergio
%ResultSet.SQL быстрее %Library.ResultSet (особенно при переборе большого числа записей результата) начиная с версии 5.2.

Но абсолютных чудес не бывает, для всех динамических запросов при первом выполнении необходима компиляция запроса, т.е. накладные расходы. Поэтому стоит динамические запросы использовать только тогда, когда это необходимо, и не забывать про передачу параметров , чтобы для плодить серию запросов ...


Из документации класса %ResultSet.SQL метод %Prepare()

...
Для %ResultSet.SQL это означает получение sql текста запроса в первом параметре и поиске реализации запроса в кэше запросов ...

Для %ResultSet.SQL, аргументами являются:

1. sqlStatement (byref) - Выражение SQL Select, также массив или строка с разделителем $$$NL ;

2. returnError (byref) - если возникнет ошибка, в нем будет объект %SYSTEM.Error... Если ошибок не произойдет, в returnError будет $$$NULLOREF;

3. %importPackages - $list-список имен пакетов, используемых для разрешения любых неопределенных имен в выражении SELECT. Например, для SELECT %ID from MyTable, если %importPackages содержит "Sample", тогда схема, связанная с пакетом Sample будет использована для определения MyTable.

4.%args - значения параметров '?', содержащихся в SQL выражении.
...
Рейтинг: 0 / 0
22.02.2010, 11:17
    #36482672
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Вот это то и непонятно - из того топика брал пример - переделывал запрос на параметрический.
А при каждом запуске формировался новый RS.CacheSqlXXXX.

А вот то что обычном %ResultSet приходиться время от времени чистить запросы $system.SQL.Purge(), если например запрос не изменился а в таблицу индексы понадобавил, сталкивался не раз.
...
Рейтинг: 0 / 0
22.02.2010, 11:24
    #36482692
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
А что за "также массив или строка с разделителем $$$NL" кто знает? Пока ни нашел ничего из примеров.
...
Рейтинг: 0 / 0
22.02.2010, 11:33
    #36482710
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
я делал небольшие тесты, по SQL запросам на Cache 5.0.21 и Cache 2010
цифр точных уже не помню, но по скорости расположились они так для Cache2010
1. &sql
2. %ResultSet.SQL
3. %Library.ResultSet
а отличие в скорости от 5.0, если не ошибаюсь то разница была почти в 10 раз
отличие %ResultSet.SQL от %Library.ResultSet в том что, при подготовке запроса, генерируется отдельный класс, а не программа как для %Library.ResultSet, в этом классе сразу описаны поля которые должны появится на выходе
т.е.
для запроса вида
Код: plaintext
select Name from test.table
справедливо получение значения
Код: plaintext
1.
2.
 s val=rs.Name
и 
 s val=rs.%Get("Name")
Этот способ избавляет нас от %Execute(), параметры передаются сразу в %Prepare() (хотя я такой подход не назвал бы улучшением)

и последнее класс %Library.ResultSet устарел, и полагаю касатаельного этого класса изменений уже не будет, только если исправление ошибок
а вот %ResultSet.SQL, будет продолжать усовершенствоваться
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
22.02.2010, 20:39
    #36483602
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
doublefintА что за "также массив или строка с разделителем $$$NL" кто знает? Пока ни нашел ничего из примеров.
Наверное нечто типа этого

Код: plaintext
1.
2.
3.
4.
5.
6.
s sql( 1 ) = "SELECT ID FROM a.test"
s sql( 2 ) = "FROM a.test"
// или
s $p(sql,$$$NL) = "SELECT ID FROM a.test"
s $p(sql,$$$NL, 2 ) = "FROM a.test"
//
s result = ##class(%ResultSet.SQL).%Prepare(.sql,.err,"")

Типа читабельнее смотрится.

А куда аргументы для запроса совать? В каком виде?
...
Рейтинг: 0 / 0
22.02.2010, 21:02
    #36483626
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Прикольно :-)
буду попробовать :-)
...
Рейтинг: 0 / 0
22.02.2010, 21:26
    #36483661
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
А как запрос класса оттуда запустить?
Можно или нет?
...
Рейтинг: 0 / 0
22.02.2010, 22:13
    #36483726
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Код: plaintext
1.
Поиск NL в%*.inc (целые слова,чувствительный к регистру)
%occConstant.inc( 4 ): #define NL                 $c( 13 , 10 )
значит достаточно перевода строки
Код: plaintext
1.
classmethod %Prepare(ByRef sqlStatement As %String(MAXLEN=""), ByRef returnError As
 %SYSTEM.Error, %importPackages As %CacheString  = "", %args...) as %ResultSet.SQL
%args... с троеточием, т.е. аргументы передаем просто через запятую

Блок А.Н.
А как запрос класса оттуда запустить?
Можно или нет?
Судя по документации для таких запросов остается старый добрый %Library.ResultSet
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
22.02.2010, 23:34
    #36483809
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
DAiMor
Код: plaintext
1.
Поиск NL в%*.inc (целые слова,чувствительный к регистру)
%occConstant.inc( 4 ): #define NL                 $c( 13 , 10 )
значит достаточно перевода строки
Точнее "возврата каретки"+"перевода строки".
Т.е. можно в текстовом файле написать запрос, а потом его преспокойненько прочитать и выполнить.

DAiMor
Код: plaintext
1.
classmethod %Prepare(ByRef sqlStatement As %String(MAXLEN=""), ByRef returnError As
 %SYSTEM.Error, %importPackages As %CacheString  = "", %args...) as %ResultSet.SQL
%args... с троеточием, т.е. аргументы передаем просто через запятую
Т.е. начиная с 4-го... А сколько максимально штук? А то бывало ограничение типа до 9-ти аргументов... Или что-то возле того.
...
Рейтинг: 0 / 0
23.02.2010, 00:25
    #36483859
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
в метод нельзя передавать больше 254 параметров, 3 уже есть значит остается еще 251, думаю достаточно

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
23.02.2010, 02:34
    #36483903
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Блок А.Н.А как запрос класса оттуда запустить? Можно или нет?
В документации на предка ResultSet.SQL - IResultSet метод %Prepare


первым аргументом также может быть
<className>:<queryName>
или
<className>:<methodName>.
...
Рейтинг: 0 / 0
23.02.2010, 07:31
    #36483957
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Хм, че-то не получается

Код: plaintext
1.
2.
3.
4.
5.
6.
Class Test.Cls1 Extends (%Persistent,%Populate )
{ Property P1 As %String;
Query Q1() As %SQLQuery(CONTAINID =  1 )
{ SELECT %ID,P1 FROM Cls1
}
}
Код: plaintext
1.
2.
3.
4.
d ##class(Test.Cls1).Populate( 10 )
TEST>s rs=##class(%ResultSet.SQL).%Prepare("Test.Cls1:Q1",.err)
TEST>w err.Message
 SQL ERROR # 51 : An SQL statement expected, IDENTIFIER found
То есть он ждет чего-то другого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Обычный SQL проходит
TEST>s rs=##class(%ResultSet.SQL).%Prepare("select * from test.cls1",.err)
TEST>w err.Message
W err.Message
^
<INVALID OREF>
TEST>w rs.%Next(),"*",rs.P1
 1 *J3685
Как делать правильно?
...
Рейтинг: 0 / 0
23.02.2010, 13:46
    #36484275
neznau
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
может так попробовать

Код: plaintext
s rs=##class(%IResultSet).%Prepare("Test.Cls1:Q1",.err)

дома cache не стоит, поэтому с именем класса могу ошибиться
...
Рейтинг: 0 / 0
23.02.2010, 15:09
    #36484384
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Да, так работает
Но по исходникам класса видно, что просто вызывается %Library.ResultSet
Правда у меня дома всего лишь 2007, может в поздних версих иначе?
...
Рейтинг: 0 / 0
06.03.2010, 01:01
    #36505946
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Есть работающий запрос (%ResultSet.SQL). Как получить метаданные запроса (наименование и тип полей)? Пробовал так:
Код: plaintext
1.
2.
 s sql="Select * From Test"
 s md=##class(%ResultSet.SQL).%PrepareMetaData(sql,.err,"User")
Пишет
Код: plaintext
<UNDEFINED>%OnNew+ 10 ^%ResultSet.MetaData. 1  *tObjects 
Причем на любой запрос...

В объекте %ResultSet.SQL есть свойство %Metadata, похоже, в нем лежит сериализованный список (%Collection.ListOfObj) объектов %ResultSet.MD.Column. Но как его десериализовать?

$zv: Cache for Windows (x86-32) 2008.2 DS (Build 615)
...
Рейтинг: 0 / 0
06.03.2010, 06:20
    #36506019
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Ну, вы то %Prepare не выполнили еще, так что там ничего нет

s sql="Select * From Test"
s md=##class(%ResultSet.SQL).%PrepareMetaData(sql,.err,"User")

А далее %Metadata - это список
У меня получилось, что в
lg(%Metadata,1) - количество колонок
а далее по 10 записей на колонку, среди этих 10ти первым идет имя поля
то есть
2
12
22
и т.д.

Но не уверен, что от версии к версии каше это не меняется
...
Рейтинг: 0 / 0
06.03.2010, 06:22
    #36506020
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Неправильно написал код

Код: plaintext
1.
2.
s sql="Select * From Test"
s md=##class(%ResultSet.SQL).%Prepare(sql,.err,"User")
f i= 1 : 1 :$ll(md.%Metadata) w !,i,"-",$lg(md.%Metadata,i)
...
Рейтинг: 0 / 0
06.03.2010, 10:23
    #36506073
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Эх
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
USER>s sql="Select * From Test"
 
USER>s rs=##class(%ResultSet.SQL).%Prepare(sql,.err,"User")
 
USER>w err
 
USER>s md=##class(%ResultSet.SQL).%PrepareMetaData(sql,.err,"User")
 
<UNDEFINED>%OnNew+ 10 ^%ResultSet.MetaData. 1  *tObjects
USER 5e1>
...
Рейтинг: 0 / 0
06.03.2010, 10:33
    #36506076
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
И в списке приватных переменных действительно не определена переменная tObjects, зато есть переменная tOjects
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<UNDEFINED>%OnNew+ 10 ^%ResultSet.MetaData. 1  *tObjects
USER 5e1>w
....
tOjects=""
tCount= 8 
tElements= 10 
tPtr= 72 
tBstr=""
tPtr2= 12 
tColumn="NORM2"
tColumnNbr= 8 
USER 5e1>
У меня опять проблемы с версией ? $zv: Cache for Windows (x86-32) 2008.2 DS (Build 615)
...
Рейтинг: 0 / 0
09.03.2010, 10:24
    #36508283
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
Попробуйте примеры из документации , например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  set rset=##class(%ResultSet.SQL).%Prepare("select * from test")
  set rsmeta=rset.%GetMetaData()
  do rsmeta.print()	

  ;для версии  2010 . 1  и выше
  set rs=##class(%SQL.Statement).%ExecDirect(.rst,"select * from test")
  do rst.%Metadata.%Display()
...
Рейтинг: 0 / 0
09.03.2010, 11:37
    #36508473
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%ResultSet.SQL
servit в очередной раз спасибо! %GetMetaData работает
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %ResultSet.SQL / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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