 |
 |
* Sample Read Metadata Program
* for SAS/Warehouse Administrator
*/
length primary_repos_id $ 8;
length sec_repos_id $ 8;
init:
/*
* Create an instance of the metadata API.
*/
i_api=instance(loadclass
('SASHELP.METAAPI.METAAPI.CLASS'));
l_rc=0;
/*
* Access the SAS/Warehouse Administrator
* Sample repository.
*/
path="!SASROOT\whouse\dwdemo\_master";
repos_type='WHDWENV';
/*
* Insert the Location information into the
* metadata list with
* a name of LIBRARY.
*/
l_inmeta=makelist();
l_lib=makelist();
l_inmeta=insertl(l_inmeta,l_lib,-1,'LIBRARY');
/*
* Use the default Libname Engine to
* access a Local Path.
*/
l_lib=insertc(l_lib,' ',-1,'ENGINE');
l_path=makelist();
l_lib=insertl(l_lib,l_path,-1,'PATH');
l_opts=makelist();
l_lib=insertl(l_lib,l_opts,-1,'OPTIONS');
l_path=insertc(l_path,path,-1);
/*
* Set the primary repository. If a bad
* return code is returned,
* then we can't continue.
*/
call send(i_api,'_SET_PRIMARY_REPOSITORY_',
l_rc,l_inmeta, repos_type,primary_repos_id,l_meta);
l_inmeta=dellist(l_inmeta,'Y');
if l_rc = 0 then do;
/*
* We were able to access the primary repository
* correctly.
*/
/*
* Get the list of available secondary repositories
* under this primary repository.
*
*/
l_reps=makelist();
l_meta=setniteml(l_meta,l_reps,'REPOSITORIES');
call send(i_api,'_GET_METADATA_',l_rc,l_meta);
if l_rc = 0 then do;
num_reps=listlen(l_reps);
if num_reps > 0 then do;
/*
* If any secondary repositories, select one to set as
* the active one.
*/
l_sec_rep=getiteml(l_reps,1);
call send(i_api,'_SET_SECONDARY_REPOSITORY_',l_rc,
l_sec_rep,sec_repos_id);
/*
* If l_rc = 0 then sec_repos_id contains the 8
* character repository id of this repository. This
* id is used as the first part of any identifiers that are used
* to access metadata in this secondary repository.
*/
if l_rc = 0 then do;
/*
* Get the List of Detail Tables in the secondary
* repository.
*/
of_type=sec_repos_id||'.'||'WHDETAIL';
l_tables=makelist();
call send(i_api,'_GET_METADATA_OBJECTS_',l_rc,
of_type,l_tables);
num_tables=listlen(l_tables);
if num_tables > 0 and l_rc = 0 then do;
table_id=nameitem(l_tables,1);
table_name=getitemc(l_tables,1);
put 'Processing Table: ' table_name;
/*
* Get the metadata about the Load Process that created
* this table. Note that this is an example of a
* selective query, for example preformat the input list with
* only the properties desired.
*/
get_all=0;
expand=0;
l_table_meta=makelist();
l_table_meta=insertc(l_table_meta,table_id,-1,'ID');
l_table_meta=insertl(l_table_meta,0,-1,'PROCESS');
call send(i_api,'_GET_METADATA_',l_rc,l_table_meta);
if l_rc = 0 then do;
l_process_meta=getniteml(l_table_meta,'PROCESS');
/*
* It is possible that the process has not yet been
* defined for this table. If this is the case, an
* empty list will be returned.
*/
if listlen(l_process_meta) > 0 then do;
/*
* Get all metadata known about this process by
* issuing a _GET_METADATA_ with the get_all
* parameter as 1.
*/
get_all=1;
expand=0;
call send(i_api,'_GET_METADATA_',l_rc,
l_process_meta,get_all,expand);
if l_rc = 0 then do;
/*
* Perform some processing on the returned
* metadata list.
*/
end; /* if */
else do;
msg=getnitemc(l_rc,'MSG');
rc=getnitemn(l_rc,'RC');
put msg;
put 'RC=' rc;
end; /* else */
end; /* if */
end; /* if */
else do;
msg=getnitemc(l_rc,'MSG');
rc=getnitemn(l_rc,'RC');
put msg;
put 'RC=' rc;
end; /* else */
/*
* Delete the table metadata list and all of its
* sublists.
*
* NOTE: Be extremely careful when using the DELLIST
* with the 'Y' option.
*/
l_table_meta=dellist(l_table_meta,'Y');
end; /* if */
else do;
if l_rc = 0 then do;
put 'No detail tables found.';
end; /* if */
else do;
msg=getnitemc(l_rc,'MSG');
rc=getnitemn(l_rc,'RC');
put msg;
put 'RC=' rc;
end; /* else */
end; /* else */
l_tables=dellist(l_tables);
end; /* if */
else do;
msg=getnitemc(l_rc,'MSG');
rc=getnitemn(l_rc,'RC');
put msg;
put 'RC=' rc;
end; /* else */
end; /* if */
end; /* if */
else do;
msg=getnitemc(l_rc,'MSG');
rc=getnitemn(l_rc,'RC');
put msg;
put 'RC=' rc;
end; /* else */
end; /* if */
else do;
end; /* else */
return;
term:
/*
* Make sure to _TERM_ the api object
* so that an orderly clean up
* is performed.
*/
call send(i_api,'_TERM_');
return;
 |
 |
Copyright © 2012 by SAS Institute Inc., Cary, NC, USA. All rights reserved.