Как получить идентификатор хранимого процесса?

у меня есть несколько сохраненных процессов с одинаковыми именами. Чтобы определить, какой процесс запущен в данный момент, мне нужно знать идентификатор хранимого процесса в метаданных. Могу ли я где-нибудь получить STP-id? Я не смог найти переменную, которая содержит идентификатор. Я нашел только symget('sysjobid'); который возвращает unix-processid, а не идентификатор сохраненного процесса.

Типичный идентификатор сохраненного процесса выглядит так: A5DF0R0G.B80001L7.

Мне нужно знать идентификатор внутри запущенного процесса, чтобы получить некоторые свойства процесса из метаданных.
Любое другое решение для точной идентификации процесса в метаданных также приветствуется, но я не могу использовать его имя, потому что оно может встречаться несколько раз для разных процессов.

например что-то вроде:

put 'name:' &_program; /*this already works and returns the name of the stored process*/
put 'id:' ?; /*need to know the id of the process, because name is not distinct*/

person kl78    schedule 15.07.2015    source источник
comment
Вы имеете в виду идентификатор сеанса? (&_SESSIONID)?   -  person Joe    schedule 15.07.2015
comment
Нет, я видел идентификатор сеанса в журнале, но это не идентификатор хранимого процесса. Когда в метаданные прописывается хранимый процесс, он получает уникальный идентификатор, это то, что я ищу. это выглядит так: Id, A5DF0R0G.B80001L7, поэтому всегда 8 символов до 8 символов, я не уверен, можно ли вообще получить его из процесса, но, может быть, кто-то знает это   -  person kl78    schedule 15.07.2015
comment
Ааа, 17-символьный идентификатор объекта метаданных. К сожалению, я не знаю, как это получить, возможно, кто-то знает.   -  person Joe    schedule 15.07.2015
comment
Да, извините, если вы не поняли этого из моего вопроса, но английский не мой родной язык, поэтому мне трудно объяснить правильно^^   -  person kl78    schedule 15.07.2015
comment
Нет, вопрос в порядке, я просто недостаточно знаю о сервере метаданных, чтобы понять его полностью. Судя по гуглю, это, вероятно, либо совершенно тривиально, либо почти невозможно - поскольку я не вижу никаких документов, описывающих, как это сделать... если бы это был я, я бы, вероятно, посмотрел на записи сервера метаданных и посмотрел, возможно ли найдите там третью ссылку (возможно, _sessionID хранится, например, при последнем запуске).   -  person Joe    schedule 15.07.2015


Ответы (2)


На самом деле это довольно легко сейчас, когда я смотрю на это.

Я создал этот пример STP (названный «Doms Hello World») в папке «Моя папка».

data _temp;
X = "HELLO WORLD";
path = "&_PROGRAM";
format type ID $200.;
rc= metadata_pathobj("",path,"StoredProcess",type,ID);
run;

proc print data=_temp noobs;
run;

Вы можете использовать функцию metadata_pathobj() для получения ID и TYPE элемента по пути.

Это возвращает

X            path                                               type            ID                  rc
HELLO WORLD /User Folders/dpazzula/My Folder/Doms Hello World   ClassifierMap   A5XQ9K3Z.BA0002BQ   1

Как в EG, так и через веб-приложение.

person DomPazz    schedule 15.07.2015
comment
ах, хорошо, я еще не знал функцию pathobj, всегда извлекал данные по имени или идентификатору, я попробую это завтра, пока. Но у меня более одного процесса в папке, поэтому мне нужно сначала выполнить поиск по пути, а затем выполнить поиск по имени? - person kl78; 15.07.2015
comment
Нет, имя является последним элементом пути. Итак, имя Doms Hello World и папка в My Folder. - person DomPazz; 15.07.2015
comment
а, хорошо, pathobj также включает имя процесса в поиск, так что это даже лучше, ty - person kl78; 15.07.2015

Я не думаю, что у хранимого процесса есть идентификатор, но он уникален с точки зрения своего местоположения и имени.

Пользовательская макропеременная _PROGRAM для определения запущенной хранимой процедуры. Он будет иметь формат «/Папка SAS/Папка хранимой процедуры/Имя хранимой процедуры».

Что-то вроде A5DF0R0G.B80001L7 ID хранимой процедуры, полезной при запуске приложений IOM, но я не думаю, что это было бы так полезно, когда дело доходит до определения того, какая хранимая процедура что-то создала и где она была сохранена в то время, поэтому я бы пошел с "_ПРОГРАММА".

Если вы все равно используете идентификатор, используйте этот код (кредит: https://support.selerity.com.au/entries/23169736-Example-Data-Step-View-of-Stored-Procedures-in-Metadata):

 ******************************************************************************
* Purpose: Create a dynamic view of Stored Procedures registered in Metadata
* Notes  : You must establish a Metadata connection prior to running
******************************************************************************;
data work.stplist(drop=_: label="SAS Stored Process List") /     view=work.stplist;
 length id $17 _uri name description _modified _created location _location    $256;
  length created modified 8;
  format created modified datetime.;
  label id="Metadata ID"
        name="Stored Process Name"
        description="Description"
        location="Folder Location"
        created="Created"
        modified="Last Modified";
  _nobj=1;
  _n=1;
  call missing(id, _uri, name, description, _modified, _created, _location);
  do while(_n le _nobj);
    _nobj=metadata_getnobj("omsobj:ClassifierMap?@PublicType='StoredProcess'",_n,_uri);
    _rc=metadata_getattr(_uri,"Id",id);
    _rc=metadata_getattr(_uri,"Name",name);
    _rc=metadata_getattr(_uri,"Desc",description);
    _rc=metadata_getattr(_uri,"MetadataCreated",_created);
    _rc=metadata_getattr(_uri,"MetadataUpdated",_modified);
    created=input(_created,anydtdtm.);
    modified=input(_modified,anydtdtm.);
    * Get folder object the current STP is in *;
    _rc=metadata_getnasn(_uri,"Trees",1,_uri);
    * Get folder name the current STP is in *;
    _rc=metadata_getattr(_uri,"Name",location);
    _tree=1;
    * Loop up the folder hierarchy *;
    do while (_tree>0);
      * Get the parent folder object *;
      _tree=metadata_getnasn(_uri,"ParentTree",1,_uri);
      if _tree > 0 then do;
        * If there was a parent folder, get the name *;
        _rc=metadata_getattr(_uri,"Name",_location);
        * Construct the path *;
        location=catx('/',_location,location);
      end;
    end; * Folder Hierachy *;
    location = '/'||location;
    output;
    _n=_n+1;
  end;
run;

С уважением, Василий

person Vasilij Nevlev    schedule 15.07.2015
comment
Я знаю, как получить идентификатор, если у меня есть stp с уникальным именем. Мой процесс работает очень похоже на ваш пост, но я не хочу получать все сохраненные процессы и строить путь, потому что это не очень эффективно, в случае, если мне просто нужен один конкретный процесс и мне нужно идентифицировать его чем-то другим, кроме имени , потому что имена не уникальны, и я получаю более одного результата при поиске по имени. - person kl78; 15.07.2015
comment
Моя первая идея заключалась в том, чтобы получить его по его идентификатору, потому что идентификатор уникален. Я не знал функции поиска процессов по пути, который выложил DomPazz. Но если это работает так, как я думаю, я могу идентифицировать процесс по комбинации имени и пути, потому что у меня около тысячи процессов, и я не хочу перебирать все. Но спасибо за твой ответ - person kl78; 15.07.2015