Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вызов функции SQL из другой области / 25 сообщений из 26, страница 1 из 2
03.02.2017, 17:16
    #39398363
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Коллеги, подскажите пожалуйста, есть ли возможность в области %SYS сделать запрос SQL с использованием функции (метод класса с SqlProc) из области SAMPLES?
Зачем? - генерю отчет из базы аудита, где из EventData (инфа о событии) хочу вытащить нужную инфу.
...
Рейтинг: 0 / 0
03.02.2017, 17:41
    #39398382
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,

Без проблем.
Просто меняете область через команду

Код: sql
1.
ZN 



после чего попадаете в новую область = SAMPLES
в ней запускаете код на выполнение функции (метод класса с SqlProc)

а затем делаете возврат через тот же ZN
...
Рейтинг: 0 / 0
03.02.2017, 17:43
    #39398383
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
zn "SAMPLES"

запуск функции (метод класса с SqlProc)


zn "%SYS"

Обратный возврат в область SYS
...
Рейтинг: 0 / 0
03.02.2017, 17:47
    #39398385
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Только не забудьте сохранить промежуточные данные перед сменой областей.
...
Рейтинг: 0 / 0
03.02.2017, 17:53
    #39398394
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
О-О-О, не подходит. Выше решение тоже самое, что забрать итоги запроса из %SYS и обработать их в SAMPLES. Мне нужно именно вызвать функцию из другой области, ибо делать свою функцию в %SYS нет желания (придется помнить об этом при каждой новой инсталляции)
...
Рейтинг: 0 / 0
03.02.2017, 17:54
    #39398395
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,
Код: vbnet
1.
2.
3.
4.
5.
6.
 s ns = $namespace, $namespace = "RequiredNS"
 #; do something
 s sql = "Select Event ...."
 s rs = ##class(%SQL.Statement).%ExecDirect(,sql)
 while rs.%Next() {}
 s $namespace = ns
...
Рейтинг: 0 / 0
03.02.2017, 18:05
    #39398402
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
doublefint, поясню:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ClassMethod Report ()
{
zn "%SYS"
s query =  "SELECT EventData, [вычисляемое функцией значение из EventData ]"_
               "FROM %SYS.Audit"_
	       "WHERE EventSource=?"

s rs=##class(%ResultSet).%New("%DynamicQuery:SQL")
d rs.Prepare(query)
s res = rs.Execute($namespace)
....
}



Мне нужно вычисляемое поле в результате запроса по сути
...
Рейтинг: 0 / 0
03.02.2017, 18:26
    #39398414
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,
смысл в том, чтобы группировку, вычисление средних значений взвалить на SQL (она не отображена в запросе выше), а не париться с этим самому перебором результатов
...
Рейтинг: 0 / 0
03.02.2017, 20:30
    #39398460
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakutКоллеги, подскажите пожалуйста, есть ли возможность в области %SYS сделать запрос SQL с использованием функции (метод класса с SqlProc) из области SAMPLES?
Зачем? - генерю отчет из базы аудита, где из EventData (инфа о событии) хочу вытащить нужную инфу.
Можно в определении класса сказать где лежат данные, тогда будет их брать оттуда.
Или сделать второй класс - копию для такого доступа.
http://thedarkaugust.blogspot.ru/2016/04/cache_64.html
...
Рейтинг: 0 / 0
04.02.2017, 15:16
    #39398622
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Class drakut.sql {

ClassMethod main() {

	s ns = $namespace, $namespace = "%SYS"
		s props("Database")="CACHEAUDIT"
		#;надо делаь однажды, так как добавляет событие в журнал Аудита
		s sc = ##Class(Config.MapGlobals).Create(ns,"CacheAuditD",.props)
	s $namespace = ns

	#; не используйте в запросе поля со сложными типами, например: Authentication
	#; или добавьте проекцию для их типов

	s sql = "Select drakut.sql_doSomething( Event, ? ), Description From %SYS.Audit"
	s rs  = ##class(%SQL.Statement).%ExecDirect( , sql, $namespace )
	d rs.%Display()

}

/// Пример процедуры в "этой" области
ClassMethod doSomething(	val, ns ) As %Integer [ CodeMode = expression, SqlProc ] { ns_":"_val }

}
...
Рейтинг: 0 / 0
04.02.2017, 15:45
    #39398631
Mammonth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,

Пришлось как то сделать нечно похожее, и быстро, единственное, что придумалось - я просто смапил класс той таблицы, что мне нужна в свою область, и работал с ним как с "родным".
...
Рейтинг: 0 / 0
06.02.2017, 12:22
    #39399170
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Коллеги, отвечаю на свой вопрос:
В запросе области %SYS нельзя вызвать функцию из другой области. Обращаю ваше внимание - функцию в запросе.
Пробовал выполнить такой запрос в портале в области %SYS:
Код: sql
1.
2.
3.
4.
ЫУДУСЕEventData, 
$$|MYNS|Lib_App.Report.UsersStat_getPropVal('responseTime',EventData) as RT
FROM %Sys.Audit
WHERE EventSource='MyApp'



Портал выдал ошибку: Поддержка вызова внешних функций запрещена.

Замапить %SYS.Audit в свою область тоже не получится - портал просто не предлагает в выпадающем списке нужную таблицу.
Итого остается мапинг своего пакета в %SYS, что мне не совсем подошло по регламентным соображениям.

Спасибо всем за помощь в этом посте.
...
Рейтинг: 0 / 0
06.02.2017, 15:41
    #39399357
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakutПортал выдал ошибку: Поддержка вызова внешних функций запрещена.
Вызов внешних функций можно разрешить в портале управления...
...
Рейтинг: 0 / 0
06.02.2017, 15:43
    #39399359
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut
Код: sql
1.
$$|MYNS|Lib_App.Report.UsersStat_getPropVal(...) as RT



Это что за синтаксис такой:

Классический вариант вызова такой

Код: javascript
1.
$$label^|"ns"|routine
...
Рейтинг: 0 / 0
06.02.2017, 15:48
    #39399366
newbie'
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,

System > Configuration > General SQL Settings
Allow Extrinsic Functions in SQL Statements = Yes

При существовании в области MYNS программы (mac, int) MyRoutine:
Код: sql
1.
2.
getPropVal(a,b)
 q "getPropVal"_a_b


sql запрос для вызова функции из другой области (%SYS) примет вид:
Код: sql
1.
2.
3.
4.
SELECT EventData, 
$$getPropVal^|"MYNS"|MyRoutine('responseTime',EventData) as RT
FROM %Sys.Audit
WHERE EventSource='MyApp'
...
Рейтинг: 0 / 0
06.02.2017, 16:57
    #39399434
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakutВ запросе области %SYS нельзя вызвать функцию из другой области Но можно сделать наоборот:
в области с функцией обратится к данным в области %SYS

вынести класс с функцией в область %All
...
Рейтинг: 0 / 0
08.02.2017, 11:02
    #39400694
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
doublefint, спасибо за рекомендацию отображения глобали CacheAuditD, без этого ничего не получилось бы. Однако использовать "*" (звездочку) после SELECT уже нельзя. (Сходу вопрос - является ли отображения только D-глобали достаточным и корректным для возможности делать запросы к %SYS.Audit?) SQL-запросы из своей области к области %SYS заработали, стало возможным использовать функции в самом запросе. Спасибо!
...
Рейтинг: 0 / 0
08.02.2017, 16:30
    #39401076
Mammonth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,

Как я помню, если есть глобаль с индексами, типа CacheAudit I , то ее тоже надо, иначе запросы не будут работать
...
Рейтинг: 0 / 0
08.02.2017, 17:14
    #39401125
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Mammonth,

А как же они тогда сейчас работают? )))
...
Рейтинг: 0 / 0
08.02.2017, 18:18
    #39401173
Mammonth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakut,

Ну могу лишь предположить, что без индексов оно перебором всех строк работает?
Черт его знает, как там оно устроено :) Обнаружив наличие индекса в определении класса и его отсутствие "по факту" движок может предположить что их "еще нет, но будут" и выполняет запрос перебором всех строк.
Хотя по хорошему это может быть индикатором ситуации "все-плохо-база-упала-мы-все-умрем" :)
...
Рейтинг: 0 / 0
08.02.2017, 18:18
    #39401175
Mammonth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakutMammonth,

А как же они тогда сейчас работают? )))
Вон как GUI в приме работал гораздо сильнее загадка :)) и ничего, работало же )
...
Рейтинг: 0 / 0
08.02.2017, 18:40
    #39401184
Шваров Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
drakutdoublefint, спасибо за рекомендацию отображения глобали CacheAuditD, без этого ничего не получилось бы. Однако использовать "*" (звездочку) после SELECT уже нельзя. (Сходу вопрос - является ли отображения только D-глобали достаточным и корректным для возможности делать запросы к %SYS.Audit?) SQL-запросы из своей области к области %SYS заработали, стало возможным использовать функции в самом запросе. Спасибо!
А вдруг вы не видели этот проект ?
Аналитика по всему что есть в аудите с визуализацией в DeepSee. Автор тут же в этом треде )
...
Рейтинг: 0 / 0
08.02.2017, 20:46
    #39401245
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Mammonthdrakut,

Ну могу лишь предположить, что без индексов оно перебором всех строк работает?
Черт его знает, как там оно устроено :) Обнаружив наличие индекса в определении класса и его отсутствие "по факту" движок может предположить что их "еще нет, но будут" и выполняет запрос перебором всех строк.
Хотя по хорошему это может быть индикатором ситуации "все-плохо-база-упала-мы-все-умрем" :)
Запрос компилируется без учета данных в базе, только на основе метаданных. В зависимости от условий, сортировки, селективностей, списка индексов и выбираемых полей, план запроса может использовать *D глобал, *I глобал или оба. Если у вас все работает только с D глобалом - это не очень хорошо, потому что со временем это будет очень медленно.
...
Рейтинг: 0 / 0
09.02.2017, 18:20
    #39401825
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Упс, убежало раньше времени ( не везде надо нажимать ctrl+enter )

drakutиспользовать "*" (звездочку) после SELECT
И я об этом предупреждал:
Код: vbnet
1.
2.
#; не используйте в запросе ( к %SYS.Audit ) поля со сложными типами, например: Authentication
#; или добавьте проекцию для их типов


drakutявляется ли отображения только D-глобали достаточным и корректным
Подсистема Аудита достаточно специфична, продолжает развиваться ISC, надо смотреть исходники класса
В идеале, сделать свой класс-проекцию на необходимые поля, структура глобала более-менее стабильна.

* Вы же помните, что по умолчанию запущена задача, которая чистит записи аудита старше 2(?) месяцев?
...
Рейтинг: 0 / 0
09.02.2017, 18:33
    #39401830
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов функции SQL из другой области
Блок А.Н.все работает только с D глобалом
Удивительно много системных классов работает только с одной глобалью. Тот же %SYS.Audit пару лет назад не использовал индексную глобаль, сейчас не уверен. Пакет %Dictionary, проекции на ^SYS...
Когда-то разбирал код выполнения "запросов" от полюбившегося многим Zen.TablePane, там "интересно" - свои "индексы" на лету для каждого шороха на каждом клиенте, с неким подобием кеширования.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вызов функции SQL из другой области / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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