Публикация

Посмотрел записи в блоге http://community.terrasoft.ua/blogs/2968 и http://community.terrasoft.ua/blogs/2936 и подумал: а как реализовать подобный функционал на Oracle?
После поиска в Интернете нашел следующий пример
DECLARE
retval       PLS_INTEGER;
my_session   DBMS_LDAP.session;
my_attrs     DBMS_LDAP.string_collection;
my_message   DBMS_LDAP.message;
my_entry     DBMS_LDAP.message;
entry_index  PLS_INTEGER;
my_dn        VARCHAR2(256);
my_attr_name VARCHAR2(256);
my_ber_elmt  DBMS_LDAP.ber_element;
attr_index   PLS_INTEGER;
i          PLS_INTEGER;
my_vals DBMS_LDAP.STRING_COLLECTION ;
ldap_host  VARCHAR2(256);
ldap_port  VARCHAR2(256);
ldap_user  VARCHAR2(256);
ldap_passwd  VARCHAR2(256);
ldap_base  VARCHAR2(256);

BEGIN
retval         := -1;
ldap_host  := 'hostname.com' ; -- хост оида
ldap_port  := '389'; -- порт оида
ldap_user  := 'UserLogin'; -- пользователь
ldap_passwd:= 'UserPassword'; -- его пароль
ldap_base  := 'CN=User,OU=...,DC=hostname,DC=com'; -- dn пользователя для которого ищутся атрибуты

 DBMS_OUTPUT.PUT('DBMS_LDAP Search Example ');
 DBMS_OUTPUT.PUT_LINE('to directory .. ');
 DBMS_OUTPUT.PUT_LINE(RPAD('LDAP Host ',25,' ') || ': ' || ldap_host);
 DBMS_OUTPUT.PUT_LINE(RPAD('LDAP Port ',25,' ') || ': ' || ldap_port);

 -- используется механизм исключений.
 DBMS_LDAP.USE_EXCEPTION := TRUE;
 my_session := DBMS_LDAP.init(ldap_host,ldap_port);
 
 DBMS_OUTPUT.PUT_LINE (RPAD('Сессия ',25,' ')  || ': ' ||RAWTOHEX(SUBSTR(my_session,1,8)) || '(из init)');

 -- бинд к каталогу
 retval := DBMS_LDAP.simple_bind_s(my_session,ldap_user, ldap_passwd);
 
 DBMS_OUTPUT.PUT_LINE(RPAD('из simplebind ',25,' ') || ': '|| TO_CHAR(retval));
 
 -- ищем
 my_attrs(1) := 'mail'; -- если надо конкретно мыло, или еще чего. Если все - то '*'
 retval := DBMS_LDAP.search_s(my_session, ldap_base,
                              DBMS_LDAP.SCOPE_BASE,
                              'objectclass=*',
                              my_attrs,
                              0,
                              my_message);

 DBMS_OUTPUT.PUT_LINE(RPAD('из search_s ',25,' ') || ': '|| TO_CHAR(retval));
 DBMS_OUTPUT.PUT_LINE (RPAD('сообщение  ',25,' ')  || ': ' || RAWTOHEX(SUBSTR(my_message,1,8)) ||'(из search_s)');

 -- найдено
 retval := DBMS_LDAP.count_entries(my_session, my_message);
 DBMS_OUTPUT.PUT_LINE(RPAD('Записей ',25,' ') || ': '|| TO_CHAR(retval));
 DBMS_OUTPUT.PUT_LINE('---------------------------------------------------');
 -- начало
 my_entry := DBMS_LDAP.first_entry(my_session, my_message);
 entry_index := 1;

 -- цикл по каждому элементу
 while my_entry IS NOT NULL loop

   -- текущее вхождение
   my_dn := DBMS_LDAP.get_dn(my_session, my_entry);
   DBMS_OUTPUT.PUT_LINE ('        dn: ' || my_dn);
   my_attr_name := DBMS_LDAP.first_attribute(my_session,my_entry,my_ber_elmt);
   attr_index := 1;
   while my_attr_name IS NOT NULL loop

     my_vals := DBMS_LDAP.get_values (my_session, my_entry,my_attr_name);
     if my_vals.COUNT > 0 then
       FOR i in my_vals.FIRST..my_vals.LAST loop
   DBMS_OUTPUT.PUT_LINE('Найдено      ' || my_attr_name || ' : ' || SUBSTR(my_vals(i),1,200));
       end loop;   
     end if;
     my_attr_name := DBMS_LDAP.next_attribute(my_session,my_entry,my_ber_elmt);
     attr_index := attr_index+1;
--
   end loop;
   my_entry := DBMS_LDAP.next_entry(my_session, my_entry);
   DBMS_OUTPUT.PUT_LINE('===================================================');
   entry_index := entry_index+1;

end loop;
   retval := DBMS_LDAP.unbind_s(my_session);
   DBMS_OUTPUT.PUT_LINE(RPAD('unbind_res вернул ',25,' ') || ': ' || TO_CHAR(retval)); DBMS_OUTPUT.PUT_LINE('ОК');
-- Exceptions
EXCEPTION

WHEN OTHERS THEN

   DBMS_OUTPUT.PUT_LINE(' Error code    : ' || TO_CHAR(SQLCODE));
   DBMS_OUTPUT.PUT_LINE(' Error Message : ' || SQLERRM);
   DBMS_OUTPUT.PUT_LINE(' Выход по ошибке');

END;
/
Источники http://www.oracle-base.com/articles/9i/LDAPFromPLSQL9i.php и http://www.sql.ru/forum/actualthread.aspx?tid=204365

 

Нравится

Поделиться

0 комментариев
Показать все комментарии