Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вызов функции SQL из другой области  [new]
drakut
Member

Откуда: Москва
Сообщений: 68
Коллеги, подскажите пожалуйста, есть ли возможность в области %SYS сделать запрос SQL с использованием функции (метод класса с SqlProc) из области SAMPLES?
Зачем? - генерю отчет из базы аудита, где из EventData (инфа о событии) хочу вытащить нужную инфу.
3 фев 17, 17:16    [20178424]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 140
drakut,

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

ZN 


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

а затем делаете возврат через тот же ZN
3 фев 17, 17:41    [20178522]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 140
zn "SAMPLES"

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


zn "%SYS"

Обратный возврат в область SYS
3 фев 17, 17:43    [20178529]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 140
Только не забудьте сохранить промежуточные данные перед сменой областей.
3 фев 17, 17:47    [20178539]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
drakut
Member

Откуда: Москва
Сообщений: 68
О-О-О, не подходит. Выше решение тоже самое, что забрать итоги запроса из %SYS и обработать их в SAMPLES. Мне нужно именно вызвать функцию из другой области, ибо делать свою функцию в %SYS нет желания (придется помнить об этом при каждой новой инсталляции)
3 фев 17, 17:53    [20178566]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 755
drakut,
 s ns = $namespace, $namespace = "RequiredNS"
 #; do something
 s sql = "Select Event ...."
 s rs = ##class(%SQL.Statement).%ExecDirect(,sql)
 while rs.%Next() {}
 s $namespace = ns
3 фев 17, 17:54    [20178570]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
drakut
Member

Откуда: Москва
Сообщений: 68
doublefint, поясню:

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)
....
}


Мне нужно вычисляемое поле в результате запроса по сути
3 фев 17, 18:05    [20178611]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
drakut
Member

Откуда: Москва
Сообщений: 68
drakut,
смысл в том, чтобы группировку, вычисление средних значений взвалить на SQL (она не отображена в запросе выше), а не париться с этим самому перебором результатов
3 фев 17, 18:26    [20178697]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1082
drakut
Коллеги, подскажите пожалуйста, есть ли возможность в области %SYS сделать запрос SQL с использованием функции (метод класса с SqlProc) из области SAMPLES?
Зачем? - генерю отчет из базы аудита, где из EventData (инфа о событии) хочу вытащить нужную инфу.

Можно в определении класса сказать где лежат данные, тогда будет их брать оттуда.
Или сделать второй класс - копию для такого доступа.
http://thedarkaugust.blogspot.ru/2016/04/cache_64.html
3 фев 17, 20:30    [20179043]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 755
drakut,
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 }

}
4 фев 17, 15:16    [20180467]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
Mammonth
Member

Откуда:
Сообщений: 30
drakut,

Пришлось как то сделать нечно похожее, и быстро, единственное, что придумалось - я просто смапил класс той таблицы, что мне нужна в свою область, и работал с ним как с "родным".
4 фев 17, 15:45    [20180528]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
drakut
Member

Откуда: Москва
Сообщений: 68
Коллеги, отвечаю на свой вопрос:
В запросе области %SYS нельзя вызвать функцию из другой области. Обращаю ваше внимание - функцию в запросе.
Пробовал выполнить такой запрос в портале в области %SYS:
ЫУДУСЕEventData, 
$$|MYNS|Lib_App.Report.UsersStat_getPropVal('responseTime',EventData) as RT
FROM %Sys.Audit
WHERE EventSource='MyApp'


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

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

Спасибо всем за помощь в этом посте.
6 фев 17, 12:22    [20183879]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12709
drakut
Портал выдал ошибку: Поддержка вызова внешних функций запрещена.

Вызов внешних функций можно разрешить в портале управления...
6 фев 17, 15:41    [20185215]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12709
drakut
$$|MYNS|Lib_App.Report.UsersStat_getPropVal(...) as RT


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

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

$$label^|"ns"|routine
6 фев 17, 15:43    [20185230]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
newbie'
Guest
drakut,

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

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

sql запрос для вызова функции из другой области (%SYS) примет вид:
SELECT EventData, 
$$getPropVal^|"MYNS"|MyRoutine('responseTime',EventData) as RT
FROM %Sys.Audit
WHERE EventSource='MyApp'
6 фев 17, 15:48    [20185257]     Ответить | Цитировать Сообщить модератору
 Re: Вызов функции SQL из другой области  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 755
drakut
В запросе области %SYS нельзя вызвать функцию из другой области
Но можно сделать наоборот:
  • в области с функцией обратится к данным в области %SYS
  • вынести класс с функцией в область %All
  • 6 фев 17, 16:57    [20185650]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    drakut
    Member

    Откуда: Москва
    Сообщений: 68
    doublefint, спасибо за рекомендацию отображения глобали CacheAuditD, без этого ничего не получилось бы. Однако использовать "*" (звездочку) после SELECT уже нельзя. (Сходу вопрос - является ли отображения только D-глобали достаточным и корректным для возможности делать запросы к %SYS.Audit?) SQL-запросы из своей области к области %SYS заработали, стало возможным использовать функции в самом запросе. Спасибо!
    8 фев 17, 11:02    [20191850]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    Mammonth
    Member

    Откуда:
    Сообщений: 30
    drakut,

    Как я помню, если есть глобаль с индексами, типа CacheAuditI , то ее тоже надо, иначе запросы не будут работать
    8 фев 17, 16:30    [20193972]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    drakut
    Member

    Откуда: Москва
    Сообщений: 68
    Mammonth,

    А как же они тогда сейчас работают? )))
    8 фев 17, 17:14    [20194192]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    Mammonth
    Member

    Откуда:
    Сообщений: 30
    drakut,

    Ну могу лишь предположить, что без индексов оно перебором всех строк работает?
    Черт его знает, как там оно устроено :) Обнаружив наличие индекса в определении класса и его отсутствие "по факту" движок может предположить что их "еще нет, но будут" и выполняет запрос перебором всех строк.
    Хотя по хорошему это может быть индикатором ситуации "все-плохо-база-упала-мы-все-умрем" :)
    8 фев 17, 18:18    [20194406]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    Mammonth
    Member

    Откуда:
    Сообщений: 30
    drakut
    Mammonth,

    А как же они тогда сейчас работают? )))

    Вон как GUI в приме работал гораздо сильнее загадка :)) и ничего, работало же )
    8 фев 17, 18:18    [20194410]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    Шваров Евгений
    Member

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

    А вдруг вы не видели этот проект?
    Аналитика по всему что есть в аудите с визуализацией в DeepSee. Автор тут же в этом треде )
    8 фев 17, 18:40    [20194461]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3411
    Mammonth
    drakut,

    Ну могу лишь предположить, что без индексов оно перебором всех строк работает?
    Черт его знает, как там оно устроено :) Обнаружив наличие индекса в определении класса и его отсутствие "по факту" движок может предположить что их "еще нет, но будут" и выполняет запрос перебором всех строк.
    Хотя по хорошему это может быть индикатором ситуации "все-плохо-база-упала-мы-все-умрем" :)

    Запрос компилируется без учета данных в базе, только на основе метаданных. В зависимости от условий, сортировки, селективностей, списка индексов и выбираемых полей, план запроса может использовать *D глобал, *I глобал или оба. Если у вас все работает только с D глобалом - это не очень хорошо, потому что со временем это будет очень медленно.
    8 фев 17, 20:46    [20194757]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 755
    Упс, убежало раньше времени ( не везде надо нажимать ctrl+enter )

    drakut
    использовать "*" (звездочку) после SELECT

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

    drakut
    является ли отображения только D-глобали достаточным и корректным

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

    * Вы же помните, что по умолчанию запущена задача, которая чистит записи аудита старше 2(?) месяцев?
    9 фев 17, 18:20    [20198020]     Ответить | Цитировать Сообщить модератору
     Re: Вызов функции SQL из другой области  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 755
    Блок А.Н.
    все работает только с D глобалом

    Удивительно много системных классов работает только с одной глобалью. Тот же %SYS.Audit пару лет назад не использовал индексную глобаль, сейчас не уверен. Пакет %Dictionary, проекции на ^SYS...
    Когда-то разбирал код выполнения "запросов" от полюбившегося многим Zen.TablePane, там "интересно" - свои "индексы" на лету для каждого шороха на каждом клиенте, с неким подобием кеширования.
    9 фев 17, 18:33    [20198048]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Caché Ответить