oracle 查詢 ldap 帳戶信息的package

原文地址:oracle 查詢 ldap 帳戶信息的package 作者:gangjh

可以table形式返回數據.

点击(此处)折叠或打开

  1. create or replace package PKG_LDAP AUTHID CURRENT_USER as
  2. /****************************************
  3.    Ver Date Author Description
  4.    --------- ---------- --------------- ------------------------------------
  5.    1.0 2013-11-10 gangjh 1. 獲取ldap 帳戶信息
  6. *****************************************************************/


  7.  type ldap_user_info is record (
  8.  search_pk varchar2(256) ,
  9.  dn varchar2(256),
  10.  sn varchar2(256) ,
  11.  cn varchar2(256) ,
  12.  mail varchar2(256) ,
  13.  givenName varchar2(256) ,
  14.  telephoneNumber varchar2(256) ,
  15.  lastLogonTimestamp varchar2(256)
  16.  ) ;

  17.  type ldap_user_table is table of ldap_user_info ;

  18.  

  19.  function get_ldap_table_s(filter varchar2)
  20.    return ldap_user_table pipelined ;
  21.  
  22. /*******************************
  23. 一個參數
  24. select * from
  25. table(pkg_ldap.get_ldap_table(
  26.      q'# select distinct mail_no from yy3mat.y3_userm where status='Y' and length(nvl(mail_no,' '))>5 #',
  27.      '(&(objectClass=top)(mail=:param1))'))
  28.      
  29. 兩個參數
  30. select * from
  31. table(pkg_ldap.get_ldap_table(
  32.     q'# select distinct mail_no,user_code
  33.             from yy3mat.y3_userm
  34.             where status='Y' and length(nvl(mail_no,' '))>5 #',
  35.     '(&(objectClass=top)(|(mail=:param1)(sn=:param2))) '))
  36. *************************************************************/

  37.  l_filter_mail constant varchar2(256) :='(&(objectClass=top)(mail=:param1))';

  38.  function get_ldap_table(sqlquery varchar2, filter varchar2 default l_filter_mail)
  39.       return ldap_user_table pipelined ;

  40. end PKG_LDAP;
  41. /
  42. create or replace package body PKG_LDAP as
  43. /**************** ldap connection **********/
  44.   l_ldap_host constant VARCHAR2(256) := 'ldapserver';
  45.   l_ldap_port constant VARCHAR2(256) := '3268';
  46.   l_ldap_user constant VARCHAR2(256) := 'user';
  47.   l_ldap_passwd constant VARCHAR2(256) := 'pass';
  48. /*********************************************/

  49. type string_array is table of varchar2(2000) index by pls_integer ;

  50. type ldap_user_array is table of ldap_user_info index by pls_integer ;


  51. procedure debug_msg(m varchar2) is
  52. begin
  53. -- dbms_output.put_line(m) ;
  54. null;
  55. end ;

  56. /***************************************************************
  57.    Ver Date Author Description
  58.    --------- ---------- --------------- ------------------------------------
  59.    1.0 2013-11-05 gangjh 1. 從ldap 檢測email account是否存在
  60. *****************************************************************/


  61. function check_mail(l_sess DBMS_LDAP.session, mail_address varchar2) return pls_integer is
  62.   l_ldap_base VARCHAR2(256) := '';
  63.   l_attrs DBMS_LDAP.string_collection;
  64.   l_filter varchar2(256) := '&(objectClass=top)(mail=$mail_address$)';
  65.   l_message DBMS_LDAP.message;

  66.   l_retval PLS_INTEGER;
  67. begin

  68.     l_attrs(1) := 'sn'; -- 中文名
  69.     l_attrs(2) := 'mail';

  70.     l_retval := DBMS_LDAP.search_s(ld => l_sess,
  71.                                    base => l_ldap_base,
  72.                                    scope => DBMS_LDAP.SCOPE_SUBTREE,
  73.                                    filter => replace(l_filter,'$mail_address$', mail_address) ,
  74.                                    attrs => l_attrs,
  75.                                    attronly => 0,
  76.                                    res => l_message);
  77.    return DBMS_LDAP.count_entries(ld => l_sess, msg => l_message) ;

  78. end check_mail;



  79. /*********************
  80. 找出所有參數, :xxx, 參數命名,冒號開始後多個字符或數字 ':[a-zA-Z0-9]+'
  81. ****************/

  82. function parser_param(str in varchar2) return string_array is
  83. -- l_filter_mail constant varchar2(256) :='&(objectClass=top)(mail=:param1)';
  84.  p1 varchar2(32767) ;
  85.  p varchar2(300) ;
  86.  ret string_array ;
  87.  i pls_integer :=0 ;
  88.  
  89. procedure foundparam(str in out varchar2 ,par out varchar2) is
  90.  idx pls_integer ;
  91.  begin
  92.    select regexp_substr(str, ':[a-zA-Z0-9]+') into par
  93.    from dual;
  94.    
  95.    if par is not null then
  96.       idx := instr(str, par) ;
  97.       str := substr(str, idx + length(par)) ;
  98.    end if ;

  99. end foundparam;

  100. begin
  101.    p1 := str ;
  102.    loop
  103.      foundparam(p1, p) ;
  104.      exit when p is null;
  105.      
  106.      i := i+1 ;
  107.      ret(i) := p ;
  108.    end loop;
  109.    return ret ;
  110. end ;




  111. function search_userinfo(l_sess DBMS_LDAP.session, l_filter varchar2) return ldap_user_info is
  112.   l_ldap_base VARCHAR2(256) := '';
  113.   l_attrs DBMS_LDAP.string_collection;
  114.   l_message DBMS_LDAP.message;

  115.   l_retval PLS_INTEGER;
  116.   l_entry DBMS_LDAP.message;

  117.   v_ret ldap_user_info := null;

  118.   function l_get_value(v_entry DBMS_LDAP.message, v_attr varchar2) return varchar2 is
  119.   l_vals DBMS_LDAP.string_collection;
  120.   begin
  121.     l_vals := DBMS_LDAP.get_values (ld => l_sess,
  122.                                     ldapentry => v_entry,
  123.                                     attr => v_attr);
  124.     if l_vals.count() >0 then
  125.         return substr(l_vals( l_vals.first),1,200);
  126.     else
  127.         return null;
  128.     end if ;
  129.   end ;

  130. begin

  131.     l_attrs(1) := 'sn'; -- 中文名
  132.     l_attrs(2) := 'cn';
  133.     l_attrs(3) := 'mail';
  134.     l_attrs(4) := 'telephoneNumber';
  135.     l_attrs(5) := 'givenName';
  136.     l_attrs(6) := 'lastLogonTimestamp';


  137.     l_retval := DBMS_LDAP.search_s(ld => l_sess,
  138.                                    base => l_ldap_base,
  139.                                    scope => DBMS_LDAP.SCOPE_SUBTREE,
  140.                                    filter => l_filter ,
  141.                                    attrs => l_attrs,
  142.                                    attronly => 0,
  143.                                    res => l_message);
  144.     if DBMS_LDAP.count_entries(ld => l_sess, msg => l_message) < 1 then
  145.         return null ;
  146.     end if ;

  147.     l_entry := DBMS_LDAP.first_entry(ld => l_sess,
  148.                                      msg => l_message);
  149.     v_ret.dn := dbms_ldap.get_dn(l_sess, l_entry) ;
  150.     v_ret.sn := l_get_value(l_entry, 'sn') ;
  151.     v_ret.cn := l_get_value(l_entry, 'cn') ;
  152.     v_ret.mail := l_get_value(l_entry, 'mail') ;
  153.     v_ret.givenName := l_get_value(l_entry, 'givenName') ;
  154.     v_ret.telephoneNumber := l_get_value(l_entry, 'telephoneNumber') ;
  155.     v_ret.lastLogonTimestamp := l_get_value(l_entry, 'lastLogonTimestamp') ;

  156.     return v_ret ;
  157. end search_userinfo;



  158. function search_usertable(l_sess DBMS_LDAP.session, l_filter varchar2) return ldap_user_array is
  159.   l_ldap_base VARCHAR2(256) := '';
  160.   l_attrs DBMS_LDAP.string_collection;
  161.   l_message DBMS_LDAP.message;

  162.   l_retval PLS_INTEGER;
  163.   l_entry DBMS_LDAP.message;

  164.   v_user ldap_user_info := null;
  165.   v_ret ldap_user_array ;

  166.   function l_get_value(v_entry DBMS_LDAP.message, v_attr varchar2) return varchar2 is
  167.   l_vals DBMS_LDAP.string_collection;
  168.   begin
  169.     l_vals := DBMS_LDAP.get_values (ld => l_sess,
  170.                                     ldapentry => v_entry,
  171.                                     attr => v_attr);
  172.     if l_vals.count() >0 then
  173.         return substr(l_vals( l_vals.first),1,200);
  174.     else
  175.         return null;
  176.     end if ;
  177.   end ;

  178. begin

  179.     l_attrs(1) := 'sn'; -- 中文名
  180.     l_attrs(2) := 'cn';
  181.     l_attrs(3) := 'mail';
  182.     l_attrs(4) := 'telephoneNumber';
  183.     l_attrs(5) := 'givenName';
  184.     l_attrs(6) := 'lastLogonTimestamp';


  185.     l_retval := DBMS_LDAP.search_s(ld => l_sess,
  186.                                    base => l_ldap_base,
  187.                                    scope => DBMS_LDAP.SCOPE_SUBTREE,
  188.                                    filter => l_filter ,
  189.                                    attrs => l_attrs,
  190.                                    attronly => 0,
  191.                                    res => l_message);
  192.     if DBMS_LDAP.count_entries(ld => l_sess, msg => l_message) > 0 then

  193.       l_entry := DBMS_LDAP.first_entry(ld => l_sess,
  194.                                        msg => l_message);
  195.       WHILE l_entry IS NOT NULL LOOP
  196.         v_user.dn := dbms_ldap.get_dn(l_sess, l_entry) ;
  197.         v_user.sn := l_get_value(l_entry, 'sn') ;
  198.         v_user.cn := l_get_value(l_entry, 'cn') ;
  199.         v_user.mail := l_get_value(l_entry, 'mail') ;
  200.         v_user.givenName := l_get_value(l_entry, 'givenName') ;
  201.         v_user.telephoneNumber := l_get_value(l_entry, 'telephoneNumber') ;
  202.         v_user.lastLogonTimestamp := l_get_value(l_entry, 'lastLogonTimestamp') ;
  203.         v_ret( v_ret.count()) := v_user ;
  204.         l_entry := dbms_ldap.next_entry(ld => l_sess,
  205.                                         msg => l_entry);
  206.       END LOOP ;

  207.     end if ;

  208.     return v_ret ;
  209. end search_usertable;



  210. /******************
  211.             查詢ldap數據,返回record type數據,

  212. *****************/

  213.  function get_ldap_table(sqlquery varchar2, filter varchar2)
  214.    return ldap_user_table pipelined is
  215.   l_retval PLS_INTEGER;
  216.   l_session DBMS_LDAP.session;

  217.   c_cur1 sys_refcursor ;
  218.   v_param1 varchar2(200) ;
  219.   v_param2 varchar2(200) ;
  220.   v_param3 varchar2(200) ;
  221.   
  222.   v_userlist ldap_user_array ;
  223.   v_userinfo ldap_user_info := null ;
  224.   parmlist string_array ;
  225.   vallist string_array ;
  226.   v_search varchar2(32767) ;
  227.   
  228.   
  229.   
  230. BEGIN
  231.   -- Choose to raise exceptions.
  232.   DBMS_LDAP.USE_EXCEPTION := TRUE;

  233.   -- Connect to the LDAP server.
  234.   l_session := DBMS_LDAP.init(hostname => l_ldap_host,
  235.                               portnum => l_ldap_port);

  236.   l_retval := DBMS_LDAP.simple_bind_s(ld => l_session,
  237.                                       dn => l_ldap_user,
  238.                                       passwd => l_ldap_passwd );
  239.   parmlist := parser_param(filter) ;
  240.                                   
  241.   open c_cur1 for sqlquery ;
  242.   loop
  243.     case
  244.        when parmlist.count() =1 then fetch c_cur1 into v_param1 ;
  245.        when parmlist.count() =2 then fetch c_cur1 into v_param1,v_param2 ;
  246.        when parmlist.count() =3 then fetch c_cur1 into v_param1,v_param2, v_param3 ;
  247.        else
  248.          raise_application_error(-20013, '查詢參數過多') ;
  249.     end case;
  250.     exit when c_cur1%notfound ;
  251.     
  252.     /***********構造參數***********/
  253.     v_search := filter ;
  254.     vallist(1) := v_param1 ;
  255.     vallist(2) := v_param2 ;
  256.     vallist(3) := v_param3 ;
  257.     for i in 1.. parmlist.count() loop
  258.       v_search := replace(v_search, parmlist(i), vallist(i)) ;
  259.     end loop;
  260.     debug_msg(v_search) ;
  261.     /**********************/
  262.     v_userlist := search_usertable(l_session, v_search);

  263.     -- 沒有找到記錄,也返回一筆
  264.     if v_userlist.count() <=0 then
  265.        v_userinfo.search_pk := v_search ;
  266.        pipe row(v_userinfo) ;
  267.     end if ;
  268.     
  269.     for x in 0..v_userlist.count()-1 loop
  270.       v_userlist(x).search_pk := v_search ;
  271.       pipe row(v_userlist(x)) ;
  272.     end loop;
  273.     
  274.   end loop;
  275.   close c_cur1 ;
  276.   -- Disconnect from the LDAP server.
  277.   l_retval := DBMS_LDAP.unbind_s(ld => l_session);

  278.   return ;

  279.   exception
  280.     when others then
  281.       if c_cur1%isopen then
  282.         close c_cur1 ;
  283.       end if ;
  284.       raise ;
  285.       
  286. end ;

  287.  

  288.  function get_ldap_table_s(filter varchar2)
  289.    return ldap_user_table pipelined is
  290.   l_retval PLS_INTEGER;
  291.   l_session DBMS_LDAP.session;
  292.   
  293.   v_usertable ldap_user_array ;
  294. BEGIN
  295.   -- Choose to raise exceptions.
  296.   DBMS_LDAP.USE_EXCEPTION := TRUE;

  297.   -- Connect to the LDAP server.
  298.   l_session := DBMS_LDAP.init(hostname => l_ldap_host,
  299.                               portnum => l_ldap_port);

  300.   l_retval := DBMS_LDAP.simple_bind_s(ld => l_session,
  301.                                       dn => l_ldap_user,
  302.                                       passwd => l_ldap_passwd );
  303.     v_usertable := search_usertable(l_session, filter);

  304.     for x in 0..v_usertable.count()-1 loop
  305.       v_usertable(x).search_pk := filter ;
  306.       pipe row(v_usertable(x)) ;
  307.     end loop;
  308.     
  309.   -- Disconnect from the LDAP server.
  310.   l_retval := DBMS_LDAP.unbind_s(ld => l_session);
  311.   return ;
  312. end get_ldap_table_s;

  313.  
  314.  function get_ldap_table3(c_cur1 in sys_refcursor, filter varchar2)
  315.    return ldap_user_table pipelined is
  316.    aa ldap_user_table ;
  317.  begin
  318.   select get_ldap_table('select mail from yy3mat.y3_userm',
  319.                         '(&(objectClass=top)(mail=:param1))') into aa
  320.   from dual;
  321.   
  322.   pipe row (aa(1));
  323.   return ;
  324.  end ;
  325.  

  326. end PKG_LDAP;
  327. /

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值