Посмотрел записи в блоге 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