سؤال

I have the following Java stored procedure:

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());
        }
    }
}
/

And I create a procedure that will run the above like;

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

Now, when I run this class normally from java it works fine, it retrieves the list of LDAP user and saves them into the DB, (of course without the create or replace...)

But when I run it as a procedure in Oracle the users form LDAP do not get added to the table. I have added the addUser("tmp", "tmp"); just to see if my codes executes well, and with this line a user does get inserted, but none in the while loop

Is there a way to see some errors, when I run this procedure?

هل كانت مفيدة؟

المحلول

I have added in SQLPLUS the following

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

And I am able now to see the errors, it was related to the permission of my db user to access sockets.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top