實現Oracle對ldap資料的各類操作

regonly1發表於2009-03-10

 

在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;

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-566581/,如需轉載,請註明出處,否則將追究法律責任。

相關文章