在Oracle下实现对ldap数据的操作
当然,大前提是ldap和数据库之间的网络是要通的。
Oracle连接ldap的步骤:
首先用dbms_ldap.init(host, port)进行初始化。
该函数返回一个dbms_ldap.session类型的句柄。
初始化后开始用用户名和密码去登录ldap:dbms_ldap.simple_bind_s(session, user, password);
这个函数中的session即前面init函数返回的值。
simple_bind_s这个函数又返回一个状态码,如果成功就返回0.
到这里,ldap的连接已经完成。
下面就是对ldap数据的操作了。
首先是添加:dbms_ldap.add_s();
Oracle对ldap数据的添加过程如下:
1、定义一个要添加的数据集
l_array dbms_ldap.mod_array;
l_array := dbms_ldap.create_mod_array(5);--5是指数组个数
2、指定要增加的属性及属性的值
l_add_vals dbms_ldap.string_collection;
产品属性
l_add_vals(1) := '2009-01-01';
dbms_ldap.populate_mod_array(l_array, dbms_ldap.mod_add, 'activedate', l_add_vals);
l_add_vals(1) := '2019-01-01';
dbms_ldap.populate_mod_array(l_array, dbms_ldap.mod_add, 'inactivedate', l_add_vals);
公共属性
l_add_vals(1) := 'top';
l_add_vals(2) := 'subproduct';
dbms_ldap.populate_mod_array(l_array, dbms_ldap.MOD_ADD, 'objectclass', l_add_vals);
相当于把所有的这些值都push到l_array这个堆栈里面去了,最后再统一地对堆栈里面的数据进行一次性处理:
dbms_ldap.add_s(l_session, l_userdn, l_array);
l_userdn是指定要添加的节点dn。
我们要在“11040320102052544C21B7F8”这个机顶盒下,增加82303601这个产品,则就应该如下:
'productid=82303601, stbid=11040320102052544C21B7F8,cn=Subscriber, l=ipauth,dc=iptv,dc=com'
这样,如果之前ldap中没有这个节点的话就会增加这么一条,如果已经存在,则会报“already exist”这样的信息。
最后一步,断开与ldap的连接
dbms_ldap.unbind_s(l_session);
详细的操作过程
create or replace procedure w_proc_ldapadd(ldap_host varchar2,
ldap_port varchar2 default '389',
ldap_user varchar2 default 'cn=manager',
ldap_passwd varchar2 default 'onewaveinc',
ldap_userdn varchar2, --指定要增加的节点
active_date date ,
inactive_date date
) as
/*Created by
* 注意:该存储过程对ldap操作的权限很大,需要谨慎操作
*/
l_ldap_host varchar2(256) := ldap_host;
l_ldap_port varchar2(256) := ldap_port;
l_ldap_user varchar2(256) := ldap_user;
l_ldap_passwd varchar2(256) := ldap_passwd;
l_retval pls_integer;
l_session dbms_ldap.session;
l_add_vals dbms_ldap.string_collection;
v_inactivedate varchar2(14) := to_char(inactive_date, 'yyyymmddhh24mi');
v_activedate varchar2(14) := to_char(active_date, 'yyyymmddhh24mi');
l_array dbms_ldap.MOD_ARRAY;
begin
dbms_ldap.use_exception := true;
begin-- 连接ldap服务器
l_session := dbms_ldap.init(l_ldap_host, l_ldap_port);
l_retval := dbms_ldap.simple_bind_s(l_session, l_ldap_user, l_ldap_passwd);
exception when others then
dbms_output.put_line('coerr');
return;
end;
--增加数据
l_array := dbms_ldap.create_mod_array(5);
l_add_vals(1) := v_inactivedate;
dbms_ldap.populate_mod_array(l_array, dbms_ldap.MOD_ADD, 'inactivedate', l_add_vals);
l_add_vals(1) := v_activedate;
dbms_ldap.populate_mod_array(l_array, dbms_ldap.MOD_ADD, 'activedate', l_add_vals);
l_add_vals(1) := 'top';
l_add_vals(2) := 'subproduct';
dbms_ldap.populate_mod_array(l_array, dbms_ldap.MOD_ADD, 'objectclass', l_add_vals);
l_retval := dbms_ldap.add_s(l_session, ldap_userdn, l_array);
dbms_ldap.free_mod_array(l_array); --释放数组
dbms_output.put_line(l_retval);
-- 断开与ldap的连接
l_retval := dbms_ldap.unbind_s(l_session);
end w_proc_ldapadd;