среда, 17 апреля 2013 г.

DBMS_LDAP Example. Пример кода работы с пакетом DBMS_LDAP

Как написать простейший код, работающий с LDAP-каталогом, с использованием пакета DBMS_LDAP

Наверно вам уже приходилось сталкиваться с ситуацией, когда надо напрямую из БД Oracle обратиться за данными, находящимися в LDAP-каталоге.
Для этого существует прекрасный стандартный пакет DBMS_LDAP.
Ниже приведу пример кода, где мы хотим получить cn пользователя, зная его DN.

Declare
  ldap_session DBMS_LDAP.session:=null;
  ErrorMsg VARCHAR2(4000);
-- значение атрибута
  my_attr_value varchar2(256);      
  entry_dn varchar2(256);
  my_vals DBMS_LDAP.STRING_COLLECTION;
  my_ber_elmt DBMS_LDAP.ber_element;
  my_attrs DBMS_LDAP.STRING_COLLECTION;
  my_attr_name varchar2(256);
  my_message DBMS_LDAP.message;
  my_entry DBMS_LDAP.message;
  ret_val PLS_INTEGER:=-1;
-- distinguished name пользователя
  userDN varchar2(2000):='uid=iivanov,ou=People,dc=maxcrc,dc=com';
BEGIN
  my_attrs(1):='cn';
 
-- создание LDAP session handle (адрес сервера, порт)
  ldap_session := DBMS_LDAP.init('asusnote','389');
 
-- админ, его пароль
  ret_val := DBMS_LDAP.simple_bind_s(ldap_session,'cn=Manager,dc=maxcrc,dc=com','secret');  
   
-- ищем пользователя
  ret_val := DBMS_LDAP.search_s(ldap_session,
                                userDN,
                                DBMS_LDAP.SCOPE_BASE,
                                'objectclass=inetorgperson',
                                my_attrs,
                                0,
                                my_message);

  dbms_output.put_line('Debug :: ret_Val expected is 0, found = '|| ret_val);
  dbms_output.put_line('Debug :: if ret_Val != 0 then ckeck dbms_ldap package for error code');

-- получить значение атрибута из результатов поиска
  my_entry := DBMS_LDAP.first_entry(ldap_session, my_message);
  my_attr_name := DBMS_LDAP.first_attribute(ldap_session,my_entry,my_ber_elmt);
  my_vals := DBMS_LDAP.get_values (ldap_session, my_entry, my_attr_name);
  my_attr_value := my_vals(0);

  dbms_output.put_line('Debug :: '|| my_attr_name || ' = ' || my_attr_value);
 
EXCEPTION
 WHEN others THEN
   ErrorMsg := SQLERRM;
   dbms_output.put_line('Error :: ' || ErrorMsg);
END;

Комментариев нет:

Отправить комментарий