2010-06-08 7 views
2

나는 다음과 같은 자바 저장 프로 시저가 있습니다자바 저장 프로 시저

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "RetreiveLdap" AS 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

public class RetreiveLdap { 
    // LDAP CONFIG 
    public static String CONTEXT = "com.sun.jndi.ldap.LdapCtxFactory"; 
    public static String HOST = "ldap://192.168.30.12:389"; 
    public static String USER = "cn=root,dc=company"; 
    public static String PASSWORD = "pa55w0rd"; 
    public static String BASE = "dc=company"; 

    // Reads from LDAP 
    public static void readConfig() throws NamingException, SQLException { 
     try { 
      addUser("tmp", "tmp"); 
      Hashtable env = new Hashtable(); 
      env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT); 
      env.put(Context.PROVIDER_URL, HOST); 
      env.put(Context.SECURITY_PRINCIPAL, USER); 
      env.put(Context.SECURITY_CREDENTIALS, PASSWORD); 

      DirContext ctx = new InitialDirContext(env); 

      SearchControls sc = new SearchControls(); 
      sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      String filter = "(objectClass=person)"; 
      NamingEnumeration items = ctx.search(BASE, filter, sc); 
      System.out.println("STARTING..."); 
      while (items != null && items.hasMore()) { 
       SearchResult sr = (SearchResult) items.next(); 

       String cn = (String) sr.getAttributes().get("cn").get(); 
       String sn = (String) sr.getAttributes().get("sn").get(); 
       System.out.println("WORKING..."); 
       // save to table 
       addUser(cn, sn); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // Add LDAP user to DB. 
    public static void addUser(String cn, String sn) { 

     try { 
      Connection conn = DriverManager 
        .getConnection("jdbc:default:connection:"); 

      String sql = "INSERT INTO ldapuser " + "(cn,sn) " + "VALUES(?,?)"; 
      PreparedStatement pstmt = conn.prepareStatement(sql); 
      pstmt.setString(1, cn); 
      pstmt.setString(2, sn); 
      pstmt.executeUpdate(); 
      pstmt.close(); 
     } catch (SQLException e) { 
      System.err.println("ERROR: " + e.getMessage()); 
     } 
    } 
} 
/

을 그리고 내가 좋아하는 위를 실행하는 프로 시저를 만들;

이제
CREATE OR REPLACE PROCEDURE read_ldap 
    AS LANGUAGE JAVA 
    NAME 'RetreiveLdap.readConfig()'; 
/

(... 작성하거나 교체없이 물론) 나는 그것이 잘 작동 자바에서 일반적으로이 클래스를 실행할 때, 그것은 LDAP 사용자의 목록을 검색 그리고, DB에 저장합니다

하지만 오라클에서 프로 시저로 실행할 때 사용자 양식 LDAP는 테이블에 추가되지 않습니다. 내 코드가 잘 실행되는지 확인하기 위해 addUser("tmp", "tmp");을 추가했습니다.이 줄을 사용하면 while 루프에 아무 것도 삽입되지 않지만 아무 것도 삽입되지 않습니다.

이 절차를 수행 할 때 오류가 발생하는 것을 볼 수있는 방법이 있습니까?

답변

4

은 내가

SQL> SET SERVEROUTPUT ON 
SQL> CALL dbms_java.set_output(2000); 

다음 SQLPLUS에 추가 한 내가 오류를 볼 이제 수 있어요, 그것은 액세스 소켓 내 DB 사용자의 권한에 관련이 있었다.