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

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

Код: sql
1.
ZN 



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

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

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


zn "%SYS"

Обратный возврат в область SYS
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39398385
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только не забудьте сохранить промежуточные данные перед сменой областей.
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39398394
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О-О-О, не подходит. Выше решение тоже самое, что забрать итоги запроса из %SYS и обработать их в SAMPLES. Мне нужно именно вызвать функцию из другой области, ибо делать свою функцию в %SYS нет желания (придется помнить об этом при каждой новой инсталляции)
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39398395
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вызов функции SQL из другой области
    #39398402
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вызов функции SQL из другой области
    #39398414
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drakut,
смысл в том, чтобы группировку, вычисление средних значений взвалить на SQL (она не отображена в запросе выше), а не париться с этим самому перебором результатов
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39398460
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutКоллеги, подскажите пожалуйста, есть ли возможность в области %SYS сделать запрос SQL с использованием функции (метод класса с SqlProc) из области SAMPLES?
Зачем? - генерю отчет из базы аудита, где из EventData (инфа о событии) хочу вытащить нужную инфу.
Можно в определении класса сказать где лежат данные, тогда будет их брать оттуда.
Или сделать второй класс - копию для такого доступа.
http://thedarkaugust.blogspot.ru/2016/04/cache_64.html
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39398622
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вызов функции SQL из другой области
    #39398631
Mammonth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drakut,

Пришлось как то сделать нечно похожее, и быстро, единственное, что придумалось - я просто смапил класс той таблицы, что мне нужна в свою область, и работал с ним как с "родным".
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39399170
drakut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, отвечаю на свой вопрос:
В запросе области %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
Вызов функции SQL из другой области
    #39399357
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutПортал выдал ошибку: Поддержка вызова внешних функций запрещена.
Вызов внешних функций можно разрешить в портале управления...
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39399359
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakut
Код: sql
1.
$$|MYNS|Lib_App.Report.UsersStat_getPropVal(...) as RT



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

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

Код: javascript
1.
$$label^|"ns"|routine
...
Рейтинг: 0 / 0
Вызов функции SQL из другой области
    #39399366
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вызов функции SQL из другой области
    #39399434
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drakutВ запросе области %SYS нельзя вызвать функцию из другой области Но можно сделать наоборот:
в области с функцией обратится к данным в области %SYS

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

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

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

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

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

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

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


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

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


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